【问题标题】:javascript function object's [[scope]] property?javascript 函数对象的 [[scope]] 属性?
【发布时间】:2013-10-11 00:25:19
【问题描述】:

好的,这是一些代码

function myFunc(){
   var myvar = 8;
       function myFunc2(num){
           alert(myvar+num);
       }

   myFunc2(2);

}

myFunc();

我想澄清一下,如果有错请纠正我

我已经阅读了堆栈溢出中的大量文章,但我想知道我理解得很好还是应该阅读更多。

据我了解,幕后发生的事情是 in global execution context there it creates function object with the namemyFunc` 及其分配给全局变量对象的 [[scope]] 属性。

当我调用myFunc 时,它会创建自己的执行上下文和激活对象,其中所有函数的参数和函数声明都会在任何逐行代码执行之前初始化。

当创建内部函数对象时,它的内部 [[scope]] 属性被分配了其外部执行上下文的变量对象 + 全局变量对象的值,因此每个函数都会创建自己的执行上下文,但在此之前每个函数的内部 [[scope] ] 属性首先分配。

我已经阅读了堆栈溢出中的大量文章,但我想知道我理解得很好还是应该阅读更多。

【问题讨论】:

标签: javascript


【解决方案1】:

以下是基于我对规范的理解以及您的解释听起来不清楚的几点建议:

  • ECMAScript 3 中使用了术语“激活对象”,但在当前版本的规范中不再使用。 ES5 使用术语“词法环境”来表示由“环境记录”值组成的类型(内部类型),并且可能是对外部词法环境的引用。

  • 由于对外部词法环境的引用,范围可以被认为是一个链。因此,通过该链访问外部范围(包括全局范围)。 (当您说“[[scope]] 属性被分配了其外部执行上下文的变量对象 + 全局变量对象的值”时,听起来这两条记录都被复制到了当前函数的词法环境中,但事实并非如此。 )

希望这会有所帮助!

【讨论】:

  • 谢谢!我正在阅读高性能 JS(©2010),然后是 JS Ninja 的第二版(©2016)——这些 ES3 术语在后者中消失了,我不知道为什么。谢谢!
  • 如何访问它?
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多