JS02作用域和执行上下文

#JS使用词法作用域

词法作用域:函数的作用域在函数定义的时候确定

动态作用域:函数的作用域在函数调用的时候才确定

1
2
3
4
5
6
7
8
9
var value = 1;
function foo() {
console.log(value);
}
function bar() {
var value = 2;
foo();
}
bar();

结果是1

接下来看接下来两段代码

1
2
3
4
5
6
7
8
9
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f();
}
checkscope();

结果是local scope

1
2
3
4
5
6
7
8
9
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function f(){
return scope;
}
return f;
}
checkscope()();

结果是local scope

JavaScript 函数的执行用到了作用域链,这个作用域链是在函数定义的时候创建的。嵌套的函数 f() 定义在这个作用域链里,其中的变量 scope 一定是局部变量,不管何时何地执行函数 f(),这种绑定在执行 f() 时依然有效。

#通过执行上下文来跟踪代码

JS中有两种执行上下文,全局执行上下文和函数执行上下文,执行上下文只有一个,当JavaScript程序开始执行时就已经创建了全局上下文,在每次调用函数时创建一个新的函数执行上下文

使用词法环境跟踪变量的作用域

词法环境(作用域)是JS引擎内部用来跟踪标识符与特定变量之间的映射关系

每个执行上下文都有一个与之关联的词法环境,词法环境中包含了在上下文中定义的标识符的映射表

无论何时创建函数,都会创建一个与之相关联的词法环境,并存储在名为[[Environment]]的内部属性上