JS中的闭包是永远不可忽略的强大特性, 近来翻了翻<精粹>, 偶然解开一个小小的迷惑, 上代码:
var foo = function(){ var innerVal = 0; return { addOne: function(){ innerVal++; }, getVal: function(){ return innerVal; } }; }();// 请注意这里, 以括号结尾
var foo = function(){ var innerVal = 0; return { addOne: function(){ innerVal++; }, getVal: function(){ return innerVal; } }; };// 请注意这里, 没有括号结尾
以上两段代码唯一的不同之处就是最后一行那个括号 .
对于第一段代码, <精粹>里是这样解释的: 我们并没有把一个函数赋值给foo, 我们是把调用该函数后返回的结果赋值给它 , 注意最后一行的(). 该函数返回一个包含两个方法的对象 , 并且这些方法享有继续访问innerVal变量的特权.
那以上两段代码有什么不一样吗? 当然有!
第一个foo是一个包含两个函数的对象, 注意是它对象 !
foo.addOne(); // 加一操作
alert(foo.getVal());// 1
第二个foo是一个函数, 注意它还是个函数 , 当你调用它的时候, 才会返回包含两个方法的对象.
var bar = foo();// bar 是一个包含两个函数的对象.
bar.addOne();// 加一操作
alert(bar.getVal());// 1
以前我总搞不明白, 为什么很多JS类库老喜欢在后面加个括号, 比如: jQuery
(function(window, undefined){
// 这里面是一个巨型闭包
})(window);// 把浏览器的全局变量window对象当作参数传入闭包中, jQuery只是window对象的一个属性
所以我们可以这样获得一个jQuery对象 jQuery('.selector') == window.jQuery('.selector');
然后, 我们就可以使用该对象调用任何jQuery预定义的方法了.
小结: 通常情况下(个人理解) 在function的结尾处加上括号的目的就是为了让它返回对象, 而非函数!