您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 作用域解析 >

JS闭包作用域解析

发布时间:2019-06-28 06:27 来源:未知 编辑:admin

  简单理解,当在一个函数的外部访问函数内部定义的变量的时候就会形成一个闭包,由这个理解可以知道,当一个函数执行完成的时候,一般情况下,其作用域会被销毁,其内部定义的变量也会变得不可访问,所以闭包打破了这个现象。闭包造成一个函数执行完成之后,其创建的作用域不会被销毁,因为它被函数外部的对象或者变量所引用。由此可知,闭包可以实现作用域的延时存在,但这也会造成内存的泄露。所以在明确知道自己需要使用闭包的时候,采取使用闭包,否则就不要使用闭包。

  以上的代码执行之后会弹窗显示10.我们在demo方法的外部打印了其内部的变量,这个就是闭包。

  我们知道,当执行一个函数的时候,其访问变量的顺序是,首先在其自己的作用域上查询,如果查询不到,则会往其上层作用域来查询,一直查询到最终根作用域(也就是window对象),如果还是查询不到,则会抛出一个undefined的错误。

  首先在执行js代码之前,会产生一个全局作用域GO,也就是window对象(后面不再说明),而对于一个函数执行之前会创建自己的作用域AO,并持有其上层函数的作用域,以形成一个作用域链。

  2、 初始化形参和内部声明的变量(变量声明的提升),并初始化为undefined

  c的作用域与此类似,由于此处重点是为了根据作用域来解释闭包的原因,所以这里不再详细的说明作用域,如不了解请自行百度。

  大家知道这是由于闭包对变量的持有造成的,那么根据作用域的原理是怎么产生的呢?

  从上面的作用域链可以知道,当数组的函数想要访问i变量的时候,发现它自己的作用域中没有这个变量,所用会通过其作用域链进行查询,然后在d_AO中找到了i对象,此时i对象的值变为了10,所以arr数组中的所有的函数最后打印的结果都是一样的。

  从作用域的解释来看(如果对立即执行函数不了解的,请百度查阅立即执行函数的相关内容)

  在执行demo函数的时候,因为内部存在一个立即执行函数,所以这个匿名函数会被立即执行,它也会创建自己的作用域

  从上面的作用域链可以看出,当执行arr中的函数的时候,例如执行arr[2]的时候,首先到自己的作用域查询j变量,发现找不到j,于是沿着作用域链进行查找,首先查询2_AO,在2_AO中找到了j变量,此时j变量的值为2,于是打印的结果就为2,这样我们就实现了我们得需要。

http://ampguimods.com/zuoyongyujiexi/64.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有