观点

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

作用域

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

if (window) {
  var x = '123';
}

alert(x);

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

但是这里还是会出现 123,这是因为Javascript 中并没有块级作用域的概念。这样看起来很简单,但是其中还是有一些细微的差别。如下:

  1. 变量声明的作用域开始于声明开始的地方,结束于所在函数的结尾。
  2. 函数可以在其作用域范围内被提前引用(被提升),但变量不行。
  3. 对于作用域声明,全局作用域就像一个包含页面所有代码的超大型函数。

函数提升的详细原因参照下述的 ?

来看如下代码:

i7eo_8f9183aeaa7a8ac5b3d706776260afc3.png