跨級作用域本身沒有宣告可以說的,就需要注意兩點:
1.跨級作用域內宣告的var變數並不會存在這個塊級作用域內,而是會提公升到非塊級作用域內
2.在塊級作用域內宣告function,在不同瀏覽器會有不同結果,如果是根據條件宣告function的話,請用var func = function的形象
但是為什麼會把塊級作用域單獨拎出來說呢,原因在於塊級作用域和迴圈結合的時候,就會有一些奇怪的表現了
在之前,很常見的一道面試題是這樣子的,請說出會列印出什麼?
for(var i = 0; i < 5; i++))}
當然,結果很顯然,是5個5,接著面試官又會問,如果想列印出0,1,2,3,4 需要怎麼做呢?
這裡有幾種的做法,比如使用閉包,最簡單的就是把var 變成let,這樣就可以了
for(let i = 0; i < 5; i++))}
ok,為什麼改成let 就可以了呢?這裡i只宣告了一次,為什麼每次呼叫console.log會得到不同的值?
也就是說,每次遍歷都會建立新的變數,所以我們能夠得到不同的值,其過程大概像下面:
注:我們返回乙個值,其實返回的是乙個包含這個值的物件,在es中稱之為:completionrecord
result:,包含結果值和返回型別
比如 return 3, 那麼 result:
比如 throw new error(),那麼 result:
; i < 5; i++) ,列印出來的是5個0,//第一次迴圈開始,建立新的塊級作用域
let i = 0
//執行check:i < 5
//如果check為false,則跳出迴圈
//執行迴圈體**,得到乙個結果result
// 檢測result,看是否還能繼續迴圈
//第二次迴圈開始,建立新的塊級作用域
let i = 1
i++//執行check:i < 5
//如果check為false,則跳出迴圈
//執行迴圈體**,得到乙個結果result
// 檢測result,看是否還能繼續迴圈
//第三次迴圈開始,建立新的塊級作用域
//...
}
當然,就算是var宣告的話,也會每次迴圈都會建立乙個塊級作用域,但是如最開始提到的那樣,var宣告是不會存在塊級作用域的,所以var宣告的i,在多次迴圈內都是同乙個i
全域性作用域 塊級作用域
瀏覽器環境有一頂層物件window,window的屬性和var的全域性變數等價。如果用var設定了window物件的內建屬性作為變數,內建屬性值將會被覆蓋。如果是window物件的內建屬性,輸出預設值 非內建則輸出underfined。console.log window.name window.n...
js塊級作用域
首先看乙個常見的函式,該函式輸出的是什麼呢?對的,就是5個6.為什麼會這樣呢?因為settimeout是個非同步函式,每次迴圈的時候都會建立乙個定時器,任務放到佇列裡,等主線程執行完才會執行定時器,這個時候迴圈跑完了,最後一次的 i 5 1 6,所以輸出5個6.for var i 1 i 5 i 1...
js塊級作用域
在了解這兩個api前,我們先了解一下塊級作用域這個概念。定義 是乙個語句,將多個操作封裝在一起,通常是放在乙個大括號裡,沒有返回值。為何需要塊級作用域?在es6之前,函式只能在全域性作用域和函式作用域中宣告,不能在塊級作用域中宣告。沒有塊級作用域導致很多場景不合理 1 記憶體變數可能覆蓋外層變數 v...