可憐的js居然沒有塊級作用域

2021-06-26 22:21:15 字數 772 閱讀 9864

js中在乙個函式中定義乙個for迴圈:for(var i=0;i<5;i++) 其中的i並不會隨著for迴圈的結束就銷毀,i會一直存在該函式中,這就是js和其他語言的區別,也就是js沒有塊級作用域的概念。看以下**:

function test()

alert('last_i: '+i);

}test();

執行以上**,執行for迴圈會彈出5次視窗分別為0,1,2,3,4。執行到4意味著for迴圈結束,其他語言下i就會銷毀,執行alert(『last_i:』 +i)按理說會為undefined,但js中不是,i會一直存在函式中,也就是說執行到alert(『last_i :』 +i)時會彈出last_i: 5 。而這個5就是經過for迴圈累加後的i。 

怎樣實現js的塊級作用域呢?那就是匿名函式。在匿名函式中定義的任何變數都會在執行結束後銷毀,這樣就很類似其他語言中的for迴圈中的i在執行迴圈後銷毀i。此處的匿名函式是要自執行的,也就是(function())()這種形式,兩個()(),前乙個放函式體,後乙個代表『執行』的意思,就像普通的函式呼叫,當然了也可以放引數如:(函式體)(引數)。用匿名函式模仿塊級作用域的**如下:

function test())()

alert(i);//報錯,不識別i

}test();

此時定義在匿名函式中的for迴圈,在函式階數後就銷毀i,此時**alert('last_i:'+i)執行就會報錯。這樣就和其他語言中的塊級作用域一樣。

js塊級作用域

首先看乙個常見的函式,該函式輸出的是什麼呢?對的,就是5個6.為什麼會這樣呢?因為settimeout是個非同步函式,每次迴圈的時候都會建立乙個定時器,任務放到佇列裡,等主線程執行完才會執行定時器,這個時候迴圈跑完了,最後一次的 i 5 1 6,所以輸出5個6.for var i 1 i 5 i 1...

js塊級作用域

在了解這兩個api前,我們先了解一下塊級作用域這個概念。定義 是乙個語句,將多個操作封裝在一起,通常是放在乙個大括號裡,沒有返回值。為何需要塊級作用域?在es6之前,函式只能在全域性作用域和函式作用域中宣告,不能在塊級作用域中宣告。沒有塊級作用域導致很多場景不合理 1 記憶體變數可能覆蓋外層變數 v...

JS 無塊級作用域

js作用域為 函式級作用域 記住最簡明的一句 函式中宣告的所有變數,無論是在 宣告的,在整個函式中它們都是有定義的。下面是自己的筆記 1 首先,只是在這個函式中有定義,也就是說,在輸出語句後定義和輸出語句前定義是一樣的結果,最後變數的值都是 undefined 下面兩種寫法結果一樣 function...