javascript函数对象';s[[scope]]属性?

javascript函数对象';s[[scope]]属性?,javascript,Javascript,好的,这是一些代码 function myFunc(){ var myvar = 8; function myFunc2(num){ alert(myvar+num); } myFunc2(2); } myFunc(); 我想澄清我的想法,如果我错了,请纠正我 我已经阅读了StackOverflow中的文章,但我想知道我是否理解它,或者我应该读更多 据我所知,幕后发生的事情是,在全局执行上下文中,它创建了名为myFunc`的函

好的,这是一些代码

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

   myFunc2(2);

}

myFunc();
我想澄清我的想法,如果我错了,请纠正我

我已经阅读了StackOverflow中的文章,但我想知道我是否理解它,或者我应该读更多

据我所知,幕后发生的事情是,在全局执行上下文中,它创建了名为myFunc`的函数对象,并将其[[scope]]属性指定给全局变量对象

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

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


我已经阅读了StackOverflow中的文章,但我想知道我是否理解它,或者我应该读更多

根据我对规范的理解,以及您的解释中听起来不清楚的地方,这里有几点提示:

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

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


希望这有帮助

您是否在问变量提升是否会以某种方式干扰闭包的工作方式?不,不能。我想知道我的解释是否正确?我知道这听起来像是你理解的,但有些事情仍然不清楚。我只是不知道是什么。你能用你自己的观点解释一下吗?谢谢!我在读高性能JS(©2010),然后是JS忍者的秘密第二版(©2016)——这些ES3术语在后者中消失了,我不知道为什么。谢谢如何访问它?