js闭包的问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js闭包的问题。相关的知识,希望对你有一定的参考价值。

function n()
var arr=[];
for(var i=0;i<3;i++)
arr[i]=function()console.log(i);;

return arr;

var funs=n();

funs[0]();输出的结果为什么是3??看了很久,看不懂为什么是3,有没有人解释以下。。

1、js没有块级作用域,定义的i变量属于函数n中的变量,在函数n中可以访问到;

2、函数n中主要涉及两个执行环境: arr[]中保存的函数中的局部环境,函数n的局部环境。相应的作用域链为:arr[]中的函数的变量对象->函数n的变量对象。arr[]中的函数在执行时,作用域链向上查找,自身的变量对象中没有i这个变量,继续向上查找函数n的变量对象,而在经历三次循环后,此时i的值已经是3,所以值为3.

3、如果要让i为相应的数值,应该延长作用域链,使用匿名函数构造块级作用域,方法如下:

function n()
    var arr = [];
    for(var i = 0; i < 3; i++)
       
       // 这里通过匿名函数,传入的参数i是传入的值i的一个副本,会把此时i的值保存下来
       arr[i] = (function (i) 
           return function()console.log(i);
       )(i);
    
    return arr;

var funs = n();

funs[0]();
funs[1]();
funs[2]();

参考技术A 闭包这个问题确实有点不好理解!
可以这样理解闭包就是一个自己单独的范围,变量都在里面有自己的范围。外界无法直接访问。而且内部的变量和对象是会保持状态的!。。。。不知道说的是否明白。
在你这个例子中
funs[0](); 输出3,如果你再测试funs[1]();和funs[2]();的话会发现还是输出3,那代表什么呢?
!!!
i=3;
for循环进行了3次i++,所以i是3.
可是3次赋值给arr[i] 的时候,i是不一样的呀?
这有说明什么呢?
i 在闭包中是保持状态的。 嗯。。。。不知道能不能明白。
说实话我觉得js闭包这玩意就是个bug(开发js引擎那帮孙子将错就错,高的挺深奥似的。哈哈 反正我是这么觉得!),没必要高太明白。有个感性的认识就OK了。
就是说在闭包作用域里变量是保持状态的,就像动态语言里的static变量差不多单独保存在内存中的一个区域等待访问和改变(有点类似,但是访问和改变的方式差别很大),在单独在内存中。你一改变,所有读取这个变量的地方再读取都会读取到改变后的值。。。。我觉得这个在js里是不合理的。一下子很难理解,没必要搞这么个东西。
再形容一下,闭包就是单独的,脱离整体的作用域,一旦生成就是独立到外面的一块东西(一个作用域)。
无法直接改变。只能通过闭包中的返回的方法来改变或访问。
嗯~~~~~~~~~~~~说的我自己都晕了。反正大概这个意思。
我觉得知道个大概就行了,能用上这玩意的机会实在是渺茫。
顶多偶尔出现个不能理解的bug,突然发现是闭包闹闹的。(反正我干了10多年了是没见过有人干这种事)。
嗯 差不多就这样了本回答被提问者采纳

以上是关于js闭包的问题。的主要内容,如果未能解决你的问题,请参考以下文章

js闭包

JS闭包理解

JS闭包的基础知识,闭包的本质,闭包的作用,闭包的间谍属性和闭包的遗憾

js 闭包(面试题)

js 闭包 具体作用?

js闭包函数