深入理解JavaScript作用域链与闭包

作用域链

和函数的原型一样,当创建一个函数之后,也会为函数对象添加一个属性[[Scopes]]记录他的作用域。该属性时一个栈,应该不可以修改,但是我们可以在调试模式中看到。

[[Scopes]]属性记录了当前作用域与活动对象,在函数运行时会向栈内压入一个元素,标识当前的作用域,等函数运行结束后,会将栈顶的元素弹出,销毁掉当前的作用域。

此外,当我们讨论闭包的时候,[[Scopes]]属性有一个非常重要的特点,那就是他会存储调用函数的作用域。举个例子,A函数内创建了函数B,那么B的[[Scopes]]就会有A函数作用域。此外,所有函数都会包括global作用域。我们也可以猜到,表示函数运行时作用域的是栈顶元素,而栈顶的属性会屏蔽掉非栈顶相同属性。

我们看个例子,因为无法看到函数运行时的情况,所有这里看不到函数运行时的作用域。这里主要看一下单个函数和函数内创建函数的不同。

function createComparisonFuntion(propertyName) {
    return 

猜你喜欢

转载自blog.csdn.net/qq_45467083/article/details/105817030