var 關鍵字 在 ES5 及以前,通過var在塊級作用域中聲明的變數,外邊也可以訪問。塊級作用域就是一對{}的作用域;塊級作用域可以是控制語句的作用域,也就是非函數的作用域。 function f() { { var x = 10; } console.log(x); // => 10 } 在 f ...
var 關鍵字
在 ES5 及以前,通過var
在塊級作用域中聲明的變數,外邊也可以訪問。塊級作用域就是一對{}
的作用域;塊級作用域可以是控制語句的作用域,也就是非函數的作用域。
function f() {
{ var x = 10; }
console.log(x); // => 10
}
在 for 迴圈體中的變數 i,可以被列印出來,假如因為代碼過多,不知道何時間變數重命名了,只有運行時才報錯。又因為只有函數才可以創建一個塊級作用域,所以,針對於上面出現的問題,就要通過 IIFE
來創建一個塊級作用域。Ben Alman 將它命名為立即執行的函數表達式(IIFE):
function iife() {
(function () {
for (var i = 10; i > 0; i--) {}
})();
console.log(i); // => Uncaught ReferenceError: i is not defined
}
let 關鍵字
var
可以穿透控制語句、條件語句這樣的作用域,導致變數衝突經常發生。所以,ES6 的let
就可以很好的解決我們的煩惱,這也是為什麼現在推薦使用let
來聲明變數,而非var
。
function f() {
for (var i = 10; i > 0; i--) {}
console.log(i); // => Uncaught ReferenceError: i is not defined
}
補充
如果不給 IIFE 函數加上分號,啟用格式化代碼之後可能導致兩個 IIFE 函數連在一起:
(function () {
// ...
})()(function () {
// ...
})();
可以通過!
或void
來避免:
!(function () {
// ...
})()
void (function () {
// ...
})()