作用域
- 在JavaScript中{}外面的作用域, 我們稱之為全局作用域
- 在JavaScript中函數(shù)后面{}中的的作用域, 我們稱之為"局部作用域"
- 在ES6中只要{}沒有和函數(shù)結(jié)合在一起, 那么應(yīng)該"塊級作用域"
- 塊級作用域和局部作用域區(qū)別
- 在塊級作用域中通過var定義的變量是全局變量
- 在局部作用域中通過var定義的變量是局部變量
- 無論是在塊級作用域還是在局部作用域, 省略變量前面的let或者var就會變成一個全局變量
- 在JavaScript中定義變量有兩種方式
- ES6之前: var 變量名稱;
- ES6開始: let 變量名稱;
- 區(qū)別
- 通過var定義變量,可以重復(fù)定義同名的變量,并且后定義的會覆蓋先定義的
- 如果通過let定義變量, "相同作用域內(nèi)"不可以重復(fù)定義同名的變量
- 通過var定義變量, 可以先使用后定義(預(yù)解析)
- 通過let定義變量, 不可以先使用再定義(不會預(yù)解析)
- 無論是var還是let定義在{}外面都是全局變量
- 將var定義的變量放到一個單獨的{}里面, 還是一個全局變量
- 將let定義的變量放到一個單獨的{}里面, 是一個局部變量
作用域鏈
- JavaScript代碼中至少有一個作用域, 即全局作用域奥秆。
- 凡是代碼中有函數(shù),那么這個函數(shù)就構(gòu)成另一個作用域峦失。
- 如果函數(shù)中還有函數(shù),那么在這個作用域中就又可以誕生一個作用域。
- 將這樣的所有的作用域列出來磨取,可以形成的結(jié)構(gòu)就稱之為作用域鏈。
<script>
var num = 123; // 0級作用域鏈
function test() { // 0級作用域鏈
var num = 666; // 1級作用域鏈
console.log(num);
function demo() { // 2級作用域鏈
var num = 777;
console.log(num);
}
demo();
}
test();
console.log(num);
</script>
預(yù)解析
- JavaScript代碼的執(zhí)行是由瀏覽器中的JavaScript解析器來執(zhí)行的柴墩。
- JavaScript解析器執(zhí)行JavaScript代碼的時候忙厌,分為兩個過程
- 預(yù)解析過程:
- 把變量的聲明提升到當(dāng)前作用域的最前面,只會提升聲明江咳,不會提升賦值逢净。
- 把函數(shù)的聲明提升到當(dāng)前作用域的最前面,只會提升聲明歼指,不會提升調(diào)用爹土。
- 先提升var,在提升function踩身。
- 注意點:
- 變量和函數(shù)同名時, 函數(shù)的優(yōu)先級高