闭包实质:就是变量的解析的过程来看一个简单的例子:运行结果很简单,一个打印wellcome to me.一个打印nihao。
在分析之前理解几句话:1、技术角度,每个function都是一个闭包,因为他们总能访问在它外部定义的数据;2、JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里;3、子对象会一级一级地向上寻找所有父对象的变量。所以父对象的所有变量,对于子对象是可见的,反之不成立。分析过程如下:
对于函数wellto(),定义wellto的时候会产生一个作用域链对象,为了表示方便,记作scopechain。scopechain是个有顺序的集合对象。
- scopechain的第一个对象:为了方便表示记作sc1, sc1有若干属性,引用本函数的参数和局部变量,如sc1.hi ;
- scopechain的第二个对象:为了方便表示记作sc2,sc2有若干属性,引用外层函数的参数和局部变量,如sc2.hell;
- ...
- scopechain的最后一个对象:为了方便表示记作scn,scn引用的全局的执行环境对象,也就是window对象!,如scn.openl();
这里之所以可以弹出nihao,原因就是变量解析时在wellto函数作用域链的第一个对象上找不到hello属性,然后就去第二个对象上找去了(结果还真找到了)。
联系客服