Context 执行上下文
概述
执行环境分为三种
全局,即 window / global
函数执行环境
Eval 函数
每个执行环境都有一个与之关联的变量对象(variable object)
,环境中定义的所有变量和函数都保存在这个对象中。
执行环境
用一个栈里维护执行环境,默认栈底就是 global
每当一个函数执行时,就压入这个函数的执行环境,函数执行完毕后,再弹出,然后把控制权交给之前的环境。
// 示例代码
var name = "Jack";
function func() {
console.log(name); // 访问全局作用域
}
function func2() {
var name = "啊哈哈";
console.log(name); // 访问函数内部作用域
}
func(); // Jack
func2(); // 啊哈哈
词法作用域 / 静态作用域
静态作用域:函数被定义的时候,它的作用域就已经确定了,和拿到哪里执行没有关系。
JavaScript 使用的就是静态作用域,参考下面例子
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar(); // 结果是: 1
上述代码三个作用域:全局、foo()、bar()
因为 foo() 中没有 value,那他就要向上层寻找
块级作用域
JS 默认只用两种作用域:全局作用域 / 函数作用域。使用 {}
包裹起来的是块级作用域。
if (false) {
var foo = 'bar'
}
console.log(foo) // undefined foo 被变量提升了
使用 var 创建的变量是没有块级作用域的。然而,使用 let const 是可以创建的
if (false) {
const foo = 'bar'
}
console.log(foo) // ReferenceError
创建作用域的方法
函数式作用域
function foo() { }
使用 let / const 创建块级作用域
for (let i = 0; i < 10; i++) {
console.log(i)
}
console.log(i) // ReferenceError
Last updated