理解闭包_javascript[[scope]]
Js代码?
- var?aFunction?=?new?Function(?a,?b,?"return?a+b"?);??
aFunction.[[scope]] -> globalObject (在javascript 为 window对象)
?
Js代码?
- function?someFunction?(?Parameters?)?{??
- ??
- ????????do?someting...??
- ??
- }??
?②
Js代码?- var?someFunction?=?function(?Parameters?)?{??
- ??
- ????????do?something...??
- ??
- }??
?
①创建过程如下
?下面谈谈自己对1、2两步的理解:
Js代码?
- function?someFunction(a,?b)?{??
- ????????????alert(?a?+?b?);??
- ????}??
- window.someFunction(?2,?3);??
window即全局变量通过someFunction这个属性调用了函数
?
Js代码?
- window.var1?=?"HuJin";??
- function?anontherFunction()?{??
- ?????alert(var1);??
- }??
- anontherFunction();??
![了解闭包_javascript[[scope]]](http://img.reader8.net/uploadfile/jiaocheng/2014/011404/2014011402040316437.jpg)
Js代码?
- window.var1?=?"HuJin";??
- ?function?anontherFunction()?{??
- ??????var1?=?"CaoLixiang";??
- ??????alert(var1);??
- ?}??
- anontherFunction();??
![了解闭包_javascript[[scope]]](http://img.reader8.net/uploadfile/jiaocheng/2014/011404/2014011402040316438.jpg)
Js代码?
- /*?create?a?global?variable?-?y?-?that?refers?to?an?object:-?*/??
- var?y?=?{?x:?5?};?//?object?literal?with?an?-?x?-?property??
- function?exampleFuncWith()?{??
- ????var?z;??
- ????/*?Add?the?object?referred?to?by?the?global?variable?-?y?-?to?the?
- ???????front?of?he?scope?chain:-?
- ????*/??
- ????with(y){??
- ????????/*?evaluate?a?function?expression?to?create?a?function?object?
- ???????????and?assign?a?reference?to?that?function?object?to?the?local?
- ???????????variable?-?z?-?:-?
- ????????*/??
- ????????z?=?function()?{??
- ????????????//?inner?function?expression?body;??
- ????????}??
- ????}??
- }??
- ???
- /*?execute?the?-?exampleFuncWith?-?function:-?*/??
- exampleFuncWith();??
?
当exampleFuncWith函数被调用的时候自然会产生一个新的执行上下文,其中的作用域链包含Activation对象之后紧接着全局对象。当执行到with语句的时候,会将全局变量y添加到作用域最前,这时候恰好碰到一个函数表达式的执行。函数表达式执行产生的函数对象其中的[[scope]]属性被赋值为当前创建其的执行上下文,那么显而易见,由于刚刚所说的,现在的执行上下文中包含y,且其位置还要在Activation对象之前,此时作用域链的排列是这样的:y > Activation > global object,因此这个函数表达式就受到with语句的影响。
从图中很容易发现,如果在不存在with语句时,函数对象的[[scope]]属性与外层函数(或者全局对象)的执行上下文有着密切的联系,这种联系也就形成了作用域链,建立了内外函数的沟通桥梁,这样也便很容易理解为什么内层函数可以访问外层函数局部变量。