茉莉网
当前位置:首页»其它

闭包对外部提供变量 闭包与变量的经典问题

2017年09月29日 来源:闭包对外部提供变量 大字体小字体

读取一篇Javascript问题贴的收获 网之易智能云

  我第一次看到这个解释后有了这么一连串疑问:虽然知道i最终是10,但是在每次赋值过程中i并不是10啊,为什么非要取最后一个值呢?i并不是引用数据类型,为什么可以说“它们引用的都是同一个变量i?

  我们知道,在匿名方法或者lambda中,可以访问或者修改该匿的定义范围内的变量。例如:

   这样才会抛出undefined错误。

js闭包引起的事件注册问题介绍

  只有继续使用语句调用result中的某个元素:

  要理解闭包,还是可以使用下面的代码不能借助GC 。但是,需要补充一点; } return inner(); // 返回内部函数}var clos=outer("中就有类似的代码,保证内部变量不影响全局变量

  V)实现迭代器。所谓迭代器就是一种可以遍历一种集合中所谓元素的机制。每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置及如何进到下一个位置。闭包刚好适合这种场景。比如:

深入理解javascript原型和闭包

  许多人第一次接触闭包大概都是从高程里这段代码开始的:

  所有的教材在讲到这一点时都会给出这样的解释:因为每个函数都保存着createFunction中的活动对象,所以它们引用的都是同一个变量i。而循环结束后i的值为10,所以每个函数的输出都是10.

闭包用法:经典案例

  这说明了一个问题:仅仅声明某一个函数,引擎并不会对函数内部的任何变量进行查找或赋值操作。只会对函数内部的语法错误进行检查(如果往内部函数加上非法语句,那么不用调用也会报错)。

   或者是用for循环在给网页中一连串元素绑定例如onclick事件时。

  然而还是会有一部分人看了这个解释后一知半解,比如我。

  所有函数都能访问全局变量。  

  实际上,我不理解的并不是闭包这个概念,而是更为基础的,函数调用的时机。

   把i改成j,一个并没有定义的变量。

  第三步:所有的变量都声明完成之后,开始执行赋值操作,将‘globalscope’赋值给全局变量scope,开始执行函数a;

  如果你和我一样有这个疑问,其实对这个问题而言我们不理解的地方并不是闭包,但是这个问题被打上了一个严重的”闭包“标签,导致很长一段时间里我都以为自己不了解闭包。

  定义一个匿名函数,并将立即执行该匿名函数的结果赋值给数组。匿名函数有一个参数num,也是函数最终要返回的值。在每次调用这个函数时,都传入了一个变量i,每次将i的当前值复制给参数num。在这个匿名函数的内部,又创建并返回num的闭包。这样,result数组中的每个函数都有自己num变量,而不是像之前一样,全部都引用同样的一个i变量,因此就可以返回各自不同的数值了。

  解释非常简洁与正确。

编程语言中的变量作用域与闭包 「电脑玩物」

  其实就是我们现在意义上的闭包——你调用一个函数,这个函数返回另一个函数,返回的函数中存储保留了调用函数的变量。currying是闭包的鼻祖。(如果理解困难,下面会用编程语言实现上面的演算)

js中解决函数中使用外部函数局部变量的问题闭

  例如下面的代码,给button添加一个点击事件,很多人经常这么写,实际上这就是一个闭包

  结合我们上面讲过的,它的根源起始于词法阶段,在这个阶段中形成了词法作用域。最终根据调用环境产生的环境栈来形成了一个由变量对象组成的作用域链,当一个环境没有被js正常垃圾回收时,我们依然可以通过引用来访问它原始的作用域链。

  闭包,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。另一种说法认为闭包并不是函数,而是由函数和与其相关的引用环境组合而成的实体。这是因为,闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。而函数只会有一个实例。这两种定义对闭包的看法并没有不同,只是对函数的定义不同。前者对函数的定义更宽松,后者则更为严格。

  我们把代码中赋值的哪一段改一下:

  在上面示例中,闭包中的变量a存储的值并不是对上面行变量a的值的简单复制,而是继续引用外部函数定义的局部变量a中的值,直到外部函数f调用返回。闭包不会因为外部函数环境的注销而消失,会始终存在。例如:按钮1:(f(   ))()按钮2:(b=function(){alert(a);})()按钮3:(c=function(){a++;})()按钮4:(d=function(x){a=x;})(100)

  如果我们仅仅把改完之后的代码贴到console里运行,它是不会报错的。因为虽然createFunctions被调用了,却并未调用赋给result的函数。

相关内容

编辑精选

Copyright © 2015 茉莉网 http://www.szmlwh.cn. All rights reserved.