作用域
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 了, 所以会抛出错误