引擎:負責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