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的结尾处加上括号的目的就是为了让它返回对象, 而非函数!
分享到:
相关推荐
离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包...
JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...
3) 计算属性集闭包的算法,在课件里有详细说明。方法很简单,但用文字描述很抽象。。。。不解释。。。 4) 计算函数依赖的闭包。此步骤不作要求,但要会方法。个人总结:将所有属性元素组成一个集合(域)记为R;...
C语言实现三种闭包算法,能够实现传递,自反,对称闭包
实验目的:熟悉warshall算法,掌握求关系的自反闭包,对称闭包和传递闭包的方法。 实验内容:从键盘输入一个关系的关系矩阵,自动求出自反闭包、对称闭包和传递闭包。 计算传递闭包用Warshall算法。 #include...
内存泄露,闭包 内存泄露,闭包 内存泄露,闭包
闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...
计算NFA中各个状态的闭包,从键盘上输入一个NFA的描述信息(输入格式自行定义),将 该NFA的描述信息保存到合适的数据结构中,然后计算出NFA中每个状态的ε_closure。
JS闭包可被利用的常见场景。值得保留的文档。值得一看
但是,当函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止;使用闭包可以在JavaScript中模仿块级作用域(JavaScript本身没有块级作用域的概念),要点如下: 创建并立即调用一个函数...
用矩阵求对称闭包。简洁,轻松学习,相互交流。
Python闭包实例closure.py 简单示例闭包的使用 简单示例闭包的使用
原子闭包系统, 原子闭包算子和原子全蕴含系统,杨海建,李庆国,本文引进了原子闭包系统,原子闭包算子以及原子全蕴含系统等概念, 研究了它们之间的相互关系, 给出了由原子闭包系统来表示有限原子�
用矩阵求自反闭包。容易理解,轻松学习,交流经验。
Swift之闭包ClosureDemo
Swift 中的闭包和 Objective-C 中的Block讲解
闭包文件
Javascript 闭包完整解释
离散数学 闭包运算 传递闭包 自反闭包 对称闭包 warshell算法 普通算法 有界面 java编程
js闭包的详细讲解