读书人

了解闭包_javascript[[scope]]

发布时间: 2012-09-09 09:27:54 作者: rapoo

理解闭包_javascript[[scope]]

Js代码?

  1. var?aFunction?=?new?Function(?a,?b,?"return?a+b"?);??

aFunction.[[scope]] -> globalObject (在javascript 为 window对象)

?

Js代码?

  1. function?someFunction?(?Parameters?)?{??
  2. ??
  3. ????????do?someting...??
  4. ??
  5. }??

?②

Js代码?
  1. var?someFunction?=?function(?Parameters?)?{??
  2. ??
  3. ????????do?something...??
  4. ??
  5. }??

?

①创建过程如下


?下面谈谈自己对1、2两步的理解:

Js代码?

  1. function?someFunction(a,?b)?{??
  2. ????????????alert(?a?+?b?);??
  3. ????}??
  4. window.someFunction(?2,?3);??

window即全局变量通过someFunction这个属性调用了函数

?

Js代码?

  1. window.var1?=?"HuJin";??
  2. function?anontherFunction()?{??
  3. ?????alert(var1);??
  4. }??
  5. anontherFunction();??


了解闭包_javascript[[scope]]

Js代码?

  1. window.var1?=?"HuJin";??
  2. ?function?anontherFunction()?{??
  3. ??????var1?=?"CaoLixiang";??
  4. ??????alert(var1);??
  5. ?}??
  6. anontherFunction();??


了解闭包_javascript[[scope]]

Js代码?

  1. /*?create?a?global?variable?-?y?-?that?refers?to?an?object:-?*/??
  2. var?y?=?{?x:?5?};?//?object?literal?with?an?-?x?-?property??
  3. function?exampleFuncWith()?{??
  4. ????var?z;??
  5. ????/*?Add?the?object?referred?to?by?the?global?variable?-?y?-?to?the?
  6. ???????front?of?he?scope?chain:-?
  7. ????*/??
  8. ????with(y){??
  9. ????????/*?evaluate?a?function?expression?to?create?a?function?object?
  10. ???????????and?assign?a?reference?to?that?function?object?to?the?local?
  11. ???????????variable?-?z?-?:-?
  12. ????????*/??
  13. ????????z?=?function()?{??
  14. ????????????//?inner?function?expression?body;??
  15. ????????}??
  16. ????}??
  17. }??
  18. ???
  19. /*?execute?the?-?exampleFuncWith?-?function:-?*/??
  20. exampleFuncWith();??

?

exampleFuncWith函数被调用的时候自然会产生一个新的执行上下文,其中的作用域链包含Activation对象之后紧接着全局对象。当执行到with语句的时候,会将全局变量y添加到作用域最前,这时候恰好碰到一个函数表达式的执行。函数表达式执行产生的函数对象其中的[[scope]]属性被赋值为当前创建其的执行上下文,那么显而易见,由于刚刚所说的,现在的执行上下文中包含y,且其位置还要在Activation对象之前,此时作用域链的排列是这样的:y > Activation > global object,因此这个函数表达式就受到with语句的影响。


从图中很容易发现,如果在不存在with语句时,函数对象的[[scope]]属性与外层函数(或者全局对象)的执行上下文有着密切的联系,这种联系也就形成了作用域链,建立了内外函数的沟通桥梁,这样也便很容易理解为什么内层函数可以访问外层函数局部变量。

读书人网 >JavaScript

热点推荐