今天來簡單聊一聊之前寫畢設(shè)用的非常多的IIFE。
首先來看一段javascript
(function(){
})()
這其實(shí)就是IIFE(立即執(zhí)行的函數(shù)表達(dá)式)。
這個大家應(yīng)該都遇見過,不過不知道大家第一次看到這個時會不會想這樣寫有什么用途?一般是用在什么地方?
IIFE有什么用途
1.總是將代碼包裹成一個 IIFE(Immediately-Invoked Function Expression),用以創(chuàng)建獨(dú)立隔絕的定義域。這一舉措可防止全局命名空間被污染。所謂不去污染全局命名空間,是因?yàn)?IIFE 創(chuàng)建了一個新的函數(shù)作用域,你真正的業(yè)務(wù)代碼被封裝在其中,自然就不會觸碰到全局對象了。如果你需要全局對象,那就 pass 給 IIFE:
(function (global) {
// 在這里,global 就是全局對象了
})(this) // 在瀏覽器里,this 就是 window 對象
2.IIFE 還可確保你的代碼不會輕易被其它全局命名空間里的代碼所修改(i.e. 第三方庫,window 引用,被覆蓋的未定義的關(guān)鍵字等等)。
IIFE一般用在什么地方
1.無論何時,想要創(chuàng)建一個新的封閉的定義域,那就用 IIFE。它不僅避免了干擾,也使得內(nèi)存在執(zhí)行完后立即釋放。
2.所有腳本文件建議都從 IIFE 開始。
一般怎么寫IIFE
推薦
(function(){
'use strict';
// Code goes here
}());
(function($, w, d){
'use strict';
$(function() {
w.alert(d.querySelectorAll('div').length);
});
}(jQuery, window, document));
ES6中使用let取代IIFE
ES6新增了let命令,用來聲明變量。它的用法類似于var,但是所聲明的變量,只在let命令所在的代碼塊內(nèi)有效。如果我們只是在某個代碼塊中使用某個變量,我們可以使用let,再也不需要使用IIFE了:
{
let private = 1;
}
console.log(private); // 未捕獲 ReferenceError