Results 6 comments of Suoz

在全局作用域中“定义”一个函数到时候,只会创建包含全局作用域的作用域链。 只有“执行”该函数的时候,才会复制创建时的作用域,并将当前函数的局部作用域放在作用域链的顶端。

@menglingfei 在js中复制有分两种,比如说基本类型的复制,就是直接的赋值,两个变量以后互不影响。而引用类型的复制,是指两个变量同时指向一个对象。我觉得这里应该说的是后者吧。

同时 f 函数被创建,保存作用域链到 f 函数的内部属性[[scope]] ``` checkscopeContext = { AO: { arguments: { length: 0 }, scope: undefined, f: reference to function f(){} }, Scope: [AO, globalContext.VO], this: undefined }...

@mqyqingfeng 大大 ``` function checkscope(){ var scope = "local scope"; function f(){ return scope; } return f(); } ``` 你看我这么理解对么~ 执行函数checkscope时,分为预编译阶段和执行阶段,预编译阶段就是你所说的创建执行上下文、执行上下文初始化(复制函数[[scope]]属性创建作用域链、使用arguments创建活动对象、初始化活动对象{即形参、**函数声明**、变量声明}、将活动对象压入作用域链的顶端)。 当函数checkscope执行,处于预编译阶段中**函数声明**的时候,此时只是创建了f函数(只是创建了f函数的[[scope]]属性,这个属性只包含了checkscope函数的活动对象和全局变量对象,并不包含f函数的活动对象) 等到函数checkscope处于执行阶段时,就是```return f();```,此时调用f(),这时候才会创建f函数的上下文,以及上面所提到的相同四步骤。

上面说了当执行一段代码的时候,会进行一个“准备工作”,比如第一个例子中的变量提升,和第二个例子中的函数提升。 同时又说了当执行到一个函数的时候,就会进行准备工作,这里的“准备工作”,让我们用个更专业一点的说法,就叫做"执行上下文(execution contexts)"。 那么所说的是指,由于JS是一段一段执行,执行上下文就是我们所理解的“段”。 建议将第一句话更为“当执行一段代码时,会进行一个‘准备工作’,这个工作不仅包含了预编译阶段的‘变量提升、函数提升’等,还包含了执行阶段~”

@mqyqingfeng 嘻嘻 回复赶上光速 看到下一篇文章有讲到 理解了 谢谢你的解答~