【你不知道的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。
相关文章推荐
- A标签使用javascript:伪协议
- JavaScript prototype 属性
- 浅谈JavaScript原型链
- Jsoup入门
- js css+html实现简单的日历
- JSP自定义标签基础知识学习
- JSP自定义标签案例分析
- JavaScript隐式类型转换
- js事件流的三个阶段
- JS:各种不同事件触发条件。onClick,onBlur等
- JS 垃圾回收机制简介
- IE中使用js的Date函数来讲时间戳转日期格式出问题
- js闭包作用
- 浅谈javascript函数节流
- 函数式 JavaScript 简介
- javascript事件机制
- js 获取复选框 和 并改变状态
- javascript 字符串
- javascript之面向对象程序设计(对象和继承)
- .jshintrc配置文件中的一些常用配置