您的位置:首页 > Web前端 > JavaScript

【你不知道的JavaScript(上)读书笔记】第2章:词法作用域

2016-03-15 00:43 525 查看



本文已同步发表到个人博客superman66.github.io


什么是词法作用域

词法作用域就是定义在词法阶段的作用域。是不是很难理解呢、换句话说就是,词法作用域意味着作用域由书写代码时函数的位置来决定的。如果还不能理解的话,先以一个简单的例子来说明:
function fn1(a) {
var b = a * 2;
 
function fn2(c) {
console.log(a, b, c);
}
fn2(b * 3);
}
fn1(2); // 2, 4 ,12


上面这个例子包含着三个作用域
全局作用域
fn1的作用域
fn2的作用域 

根据它们定义的位置,这三个作用域应该是逐级包含的关系。

如果上面这个例子可以理解的话,那么再来看一个相对复杂一点的例子:
function foo() {
console.log(a);
}
 
function bar() {
var a = 3;
foo();
}
var a = 2;
bar(); // 2


最终的输出结果是
2
。可能会有人觉得应该输出
3
的,但是为什么却是输出
2
呢? 

根据前面所提到的词法作用域指的是作用域由书写代码时函数的位置来决定的,而不是代码执行引用的位置。只要理解了这个概念,就能明白了上面的输出结果了。 

函数
foo
是在全局作用域下定义的,因此它的作用域是属于全局作用域的子作用域。函数
bar
也是一样,属于全局作用域的子作用域。 

虽然函数
foo
在函数
bar
中执行了(二者并不存在父子作用域的关系),但是函数
fn
此时的父级作用域仍然是全局作用域。因此当引擎执行
console.log(a)
的声明时,会对变量
a
进行RHS查询。引擎在
foo
当前作用域寻找不到
a
,便往上级作用域(对
foo
而言便是全局作用域)寻找,在上级作用域找到了
a=2
,因此就输出了
2
。 

这也就是JavaScript没有动态作用域的原因。如果JavaScript支持动态作用域,那么最后的输出结果应该是
3
,而不是
2
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: