引擎:负责JavaScript程序的编译及执行过程函数
编译器:负责语法分析及代码生成code
做用域:负责收集并维护全部声明的标识符ip
做用域的嵌套:一个块或者函数嵌套在另外一个块级做用域中时,就发生了块级做用域的嵌套。所以在当前做用域中没法找到某个变量时,引擎就会在外层的做用域查找,直到找到该变量或者抵达最外层做用域(全局做用域)为止。作用域
var value=1; function bar1(){ var value=2; function foo1(){ console.log(value); } foo1(); } bar1();//2
词法做用域:一个变量和函数的词法做用域取决于该变量或函数声明的地方,写在哪词法做用域就在该块做用域。编译器
var value=1; function foo2(){ console.log(value); } function bar2(){ let value=2; foo2(); } bar2();//1
为何二者的结果不一样呢?
这是由于JS采用的是词法做用域,及变量或函数的做用域是由声明时位置决定的。对于foo1,它的做用域是bar1因此结果为2,对于foo2,它在声明时做用域是在window中,因此查找时foo2内部没有value,向外查找window中valueio