Contents

作用域

JavaScript 中有一个被称为作用域(Scope)的特性, 指当前的执行上下文中定义变量的区域.

作用域也可以根据代码层次分层, 以便子作用域可以访问父作用域, 通常是指沿着链式的作用域链查找, 而不能从父作用域引用子作用域中的变量和引用.

JavaScript 采用词法环境(lexical scoping),也就是静态作用域.

作用域最大的用处就是隔离变量, 不同作用域下同名变量不会有冲突.

var name = 'Siykt';
function sayName() {
  var name = 'Bill';
  console.log(name);
}

sayName(); // Bill

全局作用域和函数作用域

在代码中任何地方都能访问到的对象拥有全局作用域

var name = 'Siykt'; // 这个 name 变量属于全局作用域
function sayName() {
  var name = 'Bill'; // 而这个 name 变量属于函数作用域
  // 根据作用域链会先查找到函数作用域中的 name 变量
  console.log(name);
}

console.log(name); // Siykt
sayName(); // Bill

块级作用域

ES6 之前 JavaScript 没有块级作用域, 只有全局作用域和函数作用域. ES6 的到来, 为我们提供了‘块级作用域’, 可使用 let 和 const 来体现:

let const 也解决了 var 的变量提升的问题

// let 只在所在的代码块内有效
for (let i = 0; i < 10; i++) {
  // TODO Something
}

console.log(i); // 在此已经无法访问到变量 i 了, 所以会抛出错误

参考链接

深入理解 JavaScript 作用域和作用域链

Scope(作用域) - MDN

ECMAScript 6 入门