最近看了本书籍(你不知道的javascript上卷),总结一下对作用域的看法。
你可能觉得这是一句声明:
var a = 1;
但引擎认为这里有两个完全不同的的声明:
1、编译器在编译时的处理。
2、引擎在运行时的处理。
什么是编译器?
负责语法分析及代码生成等脏活累活。
什么是引擎?
从头到尾负责整个js程序的编译及执行过程。
理解了上面的内容后,我们来看看编译器与引擎是如何处理以下代码。
var a = 1;
编译器:遇到var a,编译器会询问作用域在同一个作用域的集合中是否存在相同的变量。如果存在,编译器忽略该声明,否则编译器要求作用域在当前域的集合里声明一个新的变量。
引擎:引擎运行时会询问作用域,在当前的域集合中,是否存在一个叫a的变量,如果存在,引擎使用这个变量并且将1赋值给a变量,否则继续查找该变量,找不到自然就抛出错误了。