手撕作用域与上下文

| 字数 3156

 先来抛出结论:

  1. 作用域与上下文肯定不是一回事
  2. 作用域是由 function 进行声明的而非代码块({ })。
  3. 除了全局作用域,函数只要被声明(创建了),它就有了独立的作用域。
  4. 我们常说的上下文指的是 this,这里其实对 this 更准确的说法应该被称为函数上下文(function context)
  5. 各大网文与部分书籍中所讲解的上下文,其实是执行环境(execution context)有的地方也称为执行上下文/执行上下文环境。这个执行环境不仅确定了 this (即我们常说的上下文对象),还确定了将各个作用域联系起来的作用域链
  6. 执行环境并不是我们常说的上下文,而是用来确定它的指向。
  7. 本文中将采用高程3的说法 — 执行环境。

作用域

在 Javascript 中,作用域是由 function 声明的,而不是代码块。声明的作用域创建于代码块,但不终于代码块(其他语言终于代码块)。查看以下代码:

1
2
3
4
if (window) {
 var x = '123';
}
alert(x);

在其它语言中,x 终结于大括号关闭处,alert 弹出 undefined。