在学习JavaScript的变量作用域之前,我们应当明确几点: 

  • JavaScript的变量作用域是基于其特有的作用域链的。 
  • JavaScript没有块级作用域,只有函数级作用域。
  • 函数中声明的变量在整个函数中都有定义。
  • 变量在声明它们的函数体及其子函数内是可见的。

  局部作用域的变量在一个函数内部中定义、初始化和使用,当函数终止时,变量也就不存在了。而全局变量则相反,在网页所包含的的任何JavaScript中的任何地方都可以访问全局变量,无论是直接嵌入到页面还是从JavaScript库中引入的。

  在函数内部,局部变量作用域优先级高于同名全局变量,例:

var i = 99;
var foo = function() {
    var i = 10;
    console.log(i);
}
foo();  //10 使用局部变量
console.log(i);     //99 使用全局变量

每个函数在被调用时都会创建自己的执行环境,当函数执行完,当前执行环境被销毁。每个执行环境都有一个与之关联的作用域链。在执行代码时,javascript引擎会通过搜索执行环境的作用域链来解析变量和函数名这样的标识符。解析过程从作用域链的前端开始,向上逐级查询与给定名字匹配的标识符,一旦找到标识符,搜索过程就停止,如果没找到该标识符,则沿作用域链继续向上搜索,一直搜索到全局对象,如果没有搜索到,则认为该标识符未定义。标识符在作用域链中位置越深,查找和访问它所需要时间越长,所以尽可能使用局部变量。