所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
在我个人理解,当函数a的内部函数b被外部变量c引用时,就形成了闭包
对于setTimeout函数,语法:setTimeout(code,millisec) 参数一为代码,参数二为毫秒数
在这个例子里面有几个js里面经常会面对的知识点,闭包,立即执行函数,作用域,所有可知要注意到第一个setTimeout里面匿名函数,这部分其实是放在for循环之后才会执行的,因为它是一个异步执行的函数,被放到了事件队列里最后执行。而且,每次setTimeout里面的函数执行时可以近似理解为是一次实例化。
1.�对于a
在计算a时,需要用到i,这里涉及到作用域链的知识,最内层的函数没有i的值,它会沿着链式结构一直向上查找,最终发现i是for循环执行之后的值。此时,i的循环完成,最后一次i++之后,i已经变成了4。这样,setTimeout执行3次实例化,每次i的值是不变的,最终值为a=4+4+4=12。
2.对于b
类似于a,在执行setTimeout里的函数时,需要找到i2的值,最终我们找到的是for循环到第三次时i2=i=3。(i2不会等于4,因为到最后一次i++之后,已经不会再进入循环体了)。所以类似上面,b的值是3+3+3=9。
3.对于c
这部分就涉及到闭包的理解了。在循环过程中,通过立即执行函数创建了闭包,每次i3都会被赋予当次循环时i的值并保存,i3的值依次为1,2,3,最终c=1+2+3=6。
结果
�图2 结果
对js的这个方面会持续更新中,以上本人愚见,望指教。
网友评论