所谓的 词法( 代码 )作用域, 就是代码在编写过程中体现出来的作用范围. 代码一旦写好, 不用执行,

作用范围就已经确定好了. 这个就是所谓词法作用域.

在 js 中词法作用域规则:

1.函数允许访问函数外的数据.

2.整个代码结构中只有函数可以限定作用域.

3.作用规则首先使用提升规则分析.

4.如果当前作用规则中有名字了, 就不考虑外面的名字.

在编译语言中,**通常** 代码在被引擎执行之前会经历三个步骤:

1. 词法分析(tokenzing/lexing)
2. 解析/语法分析(parsing)
3. 代码生成

而 Javascript 则是在运行时编译,边编译边执行,这个机制涉及到三样东西:

1. 引擎
2. 编译器
3. 作用域

编译器首先对代码进行编译,然后将生成的代码提供给引擎执行。引擎和编译器工作的时候,都会用到作用域。编译器编译时,会在作用域中查找标示符,如果没有找到的话则会在对应的作用域创建一个标示符。引擎在执行时不断的在作用域中查找标示符,如果一直到全局对象(Global object)都没有找到的话则抛出一个 `Reference Error` 并停止代码的执行。

主要来看一下作用域,作用域有两种主要的工作模式:词法作用域和动态作用域。大多数标准语言编译器的第一个工作阶段叫做词法化,词法作用域就是定义在词法阶段的作用域。换句话说,词法作用域是根据你写代码时变量和块作用域写在哪里来决定的,和你使用/调用的位置无关。

看几个例子:

A

var num = 123;
function f1() {
console.log( num );
}
function f2() {
var num = 456;
f1();
}
f2();
结果输出123

B

var num = 123;
function f1() {
console.log( num );
}
function f2() {
num = 456;
f1();
}
f2();

结果输出456

C

function b () {

var a = a || 2;
console.log(a);
}
var a = 1;
b() // 2

结果输出2

最新文章

  1. [Deprecated!] Android开发案例 - 微博正文
  2. Android菜鸟成长记9 -- selector的用法
  3. DOS tasklist 命令(转)
  4. UVA11624Fire!(BFS)
  5. DI 之 3.2 循环依赖 (伍)
  6. JAVA 文件下载乱码问题解决办法
  7. Struts2拦截器总结<转>
  8. C语言--返回局部变量的地址
  9. xCode6制作动态及静态Framework(转)
  10. ThinkPHP - CURD增删改查操作
  11. hdu 1298 T9(特里+DFS)
  12. Java ArrayList小程序理解
  13. Java NIO (一) 初识NIO
  14. HTML5的新的结构元素介绍
  15. java.util.BitSet 详细分析 学习笔记
  16. 毕向东—Java基础知识总结(超级经典)
  17. Exp 8 Web基础
  18. PAT甲级1114. Family Property
  19. [转]MBTiles 离线地图演示 - 基于 Google Maps JavaScript API v3 + SQLite
  20. 【Oracle】IMP-00010: not a valid export file, header failed verification

热门文章

  1. 进阶篇之纯css+字体实现五角星(半颗星)评分
  2. 显示引擎innodb状态详解
  3. Python网络数据采集7-单元测试与Selenium自动化测试
  4. python 密码学编程
  5. NOIP 2000 提高组 题解
  6. Zabbix监控nginx性能
  7. HTML <hr>标签
  8. React Native 系列(八) -- 导航
  9. CSS学习笔记!
  10. 剑指offer——矩阵覆盖(斐波那契变形)