对比代码:
【代码1】:
function each(){ var i = 0, inner ,a=[]; for(;i<10;i++){ a.push(function(){ console.log(i); }) } return a; } var a = each(); for(var i = 0; i < a.length; i++){ a[i](); }
【代码2】:
function each(){ var i = 0, inner ,a=[]; for(;i<10;i++){ a.push(function(i){ console.log(i); }) } return a; } var a = each(); for(var i = 0; i < a.length; i++){ a[i](i); }
【代码3】:
function each(){ var i = 0, inner ,a=[]; for(;i<10;i++){ cache(i); } function cache(i){ a.push(function(){ console.log(i); }) } return a; } var a = each(); for(var i = 0; i < a.length; i++){ a[i](); }
【代码4】:
function each(){ var i = 0, inner ,a=[]; for(;i<10;i++){ cache(i); } function cache(b){//这段代码和上一段代码比较目的在于,cache函数的参数被内部函数引用,无关参数名 a.push(function(){ console.log(b); }) } return a; } var a = each(); for(var i = 0; i < a.length; i++){ a[i](); }
【代码6】:
function each(){ var i = 0, inner ,a=[]; for(;i<10;i++){ cache(i); } function cache(){ a.push(function(){ console.log(i); }) } return a; } var a = each(); for(var i = 0; i < a.length; i++){ a[i](); }
【代码7】:
var body = document.body; var items = ["click","mousemove"]; for(var i = 0;i<items.length;i++){ (function(){ //自运行函数开辟了一个新的域,和外层的for明显不在一个域中 var item = items[i];//但是这里每次都保存了外层的for的临时变量。 body["on"+item] = function(){ console.log(item); } })() }
【代码8】:
var body = document.body; var items = ["click","mousemove"]; (function(){ for(var i = 0;i<items.length;i++){ var item = items[i]; body["on"+item] = function(){//函数开辟了一个新的域,和外层的for明显不在一个域中,顾item引用了外层的最终值 console.log(item); } } })()
【代码9】:
function User(pr){ for(var i in pr){ (function(which){ var p =i;//因为这里定义的自运行函数和外部的for语句已经不在同一个域中了,如果不保存临时的变量,那么将得到最终值 which["get"+p] = function(){ return pr[p]; }; which["set"+p] = function(val){ pr[p] = val; } })(this) } } var u = new User({name:"louis",age:25}) alert(u.getname()) alert(u.getage())
【代码10】:
function User(pr){ for(var i in pr){ (function(which){ //var p =i;//每次for循环都会临时保存变量的值(i),但是如果这个临时保存的值这里没有被记录下来,那么内层定义的函数依旧是去找引用的变量所在的定义层(这里是自运行函数的外层函数)的最终值。所以这里i就是去找pr对象中的最后一个属性。 //这里在引用下JQuery之父的解释:闭包允许你引用父函数中的变量,但是提供的值并非该变量创建时的值,而是父函数范围内的最终值。 //所以说,判断某个函数引用的值到底是什么?需要1.判断该函数是不是定义在另一个函数体中?2.引用的值是不是外层函数定义的? which["get"+i] = function(){ return pr[i]; }; which["set"+i] = function(val){ pr[i] = val; } })(this) } } var u = new User({name:"louis",age:25}) alert(u.getname()) alert(u.getage())
【Tips】:
函数的闭包,一定要定义在某个函数内部,才能获得这个函数的变量的最终值!
【总结】:
个人理解,闭包其实就是连接函数内部世界与外部世界的一个桥梁。作为闭包,首先,闭包所在父函数的内部的私有成员,肯定是不能直接被外部访问的。外部要访问闭包所在的父函数内部的成员,就需要提供一个接口,闭包就担任这个任务!所以可以理解其为一个桥梁,一端是函数内部的封闭世界,另一段是外部的操作。大家也可以理解闭包所在的父函数就像是一个黑匣子,闭包就是提供对外的一个接口了。
相关推荐
求文法的closure闭包,针对每个产生式,求其closure闭包,并打印输出
本Demo采用Swift语言利用Closure闭包实现两个视图控制器的反向传值,和OC中的Blocks类似,但有些区别。
本Demo利用Swift语言采用Closure闭包实现两个视图控制器的反向传值,和OC中的Blocks类似,但有些不同。
本Demo是利用Swift中的Closure闭包来实现了两个视图控制器的反向传值,和Blocks类似,但有不同之处。
补充说明:闭包可以使用USE关键连接外部变量。 总结:PHP闭包的特性其实用CLASS就可以实现类似甚至强大得多的功能,更不能和js的闭包相提并论了吧,只能期待PHP以后对闭包支持的改进。不过匿名函数还是挺有用的,...
主要介绍了Python closure闭包解释及其注意点详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
2.2 含蓄的参数当闭包没有显式声明参数时,其默认包含一个隐式的参数it 3.1 Owner,delegate和this在理解delegate之前,首先先要了解
Python闭包实例closure.py 简单示例闭包的使用 简单示例闭包的使用
JavaScript闭包(closure).pdf
主要介绍了Lua学习笔记之函数、变长参数、closure(闭包)、select等,本文着重讲解了这些特性的用法,并给出代码实例,需要的朋友可以参考下
首先看看闭包的概念:闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,闭包是由函数和与其...
闭包权威指南] Closure:The Definitive Guide Michael Bolin
主要介绍了php的instanceof和判断闭包Closure操作,结合实例形式分析了PHP使用instanceof判断类实例以及判断闭包Closure相关操作技巧,需要的朋友可以参考下
闭包(closure)。闭包其实大家都已经谈烂了。尽管如此,这里还是要试着从理论角度来讨论下闭包,看看ECMAScript中的闭包内部究竟是如何工作的
php的闭包(Closure)匿名函数详解_.docx
super_closure, 用这个不可思议的PHP库序列化闭包 PHP SuperClosure - 版本 2 用于序列化闭包和匿名函数的PHP库。简介以前,我尝试序列化一个 PHP Closure 对象。 你可能猜到了,它根本不工作。 事实上,从PHP运行时...
计算NFA中各个状态的闭包,从键盘上输入一个NFA的描述信息(输入格式自行定义),将 该NFA的描述信息保存到合适的数据结构中,然后计算出NFA中每个状态的ε_closure。
理解javascript函数式编程中的闭包(closure)_.docx
闭包一点即通 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。