以前看到老师写js的单例模式时疑惑为什么要这么写
var singleton = (function () {
var privateVariable;
function privateFunction(x) {
...privateVariable...
}
return {
firstMethod: function (a, b) {
...privateVariable...
},
secondMethod: function (c) {
...privateFunction()...
} };
}());
后来查了下资料,js中(function(){…})()立即执行函数写法理解,终于了解了。
来来来,首先嘛,JS中函数有两种命名方式
而声明式会导致函数提升,function会被解释器优先编译。即我们用声明式写函数,可以在任何区域声明,不会影响我们调用。
function XXX(){}1
函数表达式我们经常使用,而函数表达式中的function则不会出现函数提升。而是JS解释器逐行解释,到了这一句才会解释。因此如果调用在函数表达式之前,则会调用失败。
fn1();
function fn1(){}//可以正常调用
fn2();
var fn2 = function(){}//无法调用
OK,下面进入正题,对函数表达式加上(),是可以直接调用的
但是如果是对声明式的后部加上()则是会被编译器忽略。
var fn2 = function(){}();//对,就是这样
function fn1(){}();//{}会被忽略
而平常的function(){}则是一种声明式,如果加上()括号后,则会被编译器认为是函数表达式,(加上+-号都可以),从而可以用()来直接调用
(function fn1(){})();
以上转自:https://blog.csdn.net/u010958922/article/details/47007589?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
for (var i = 0; i < oLi.length; i++) {
(function (m) {
oLi[m].onmouseover = function () {
console.log(m);
oImg[indexBan].className = "";
indexBan = m;
oImg[indexBan].className = "banOn";
onChange();
}
})(i)//回调函数
}
看上去(function(j){})(i)
比较神奇,其实很简单,第一个括号定义了一个匿名函数,后一个括号是指调用了这个函数,并传入参数i
。当然这个匿名函数接受一个参数,命名为j
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。