`
susam
  • 浏览: 103246 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

闭包偶得

阅读更多

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的结尾处加上括号的目的就是为了让它返回对象, 而非函数!


 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics