今天來簡單聊一聊之前寫畢設(shè)用的非常多的IIFE翎蹈。
首先來看一段javascript
(function(){
})()
這其實(shí)就是IIFE(立即執(zhí)行的函數(shù)表達(dá)式)
。
這個(gè)大家應(yīng)該都遇見過男公,不過不知道大家第一次看到這個(gè)時(shí)會不會想這樣寫有什么用途荤堪?一般是用在什么地方?
IIFE有什么用途
1.總是將代碼包裹成一個(gè) IIFE(Immediately-Invoked Function Expression),用以創(chuàng)建獨(dú)立隔絕的定義域枢赔。這一舉措可防止全局命名空間被污染澄阳。所謂不去污染全局命名空間,是因?yàn)?IIFE 創(chuàng)建了一個(gè)新的函數(shù)作用域踏拜,你真正的業(yè)務(wù)代碼被封裝在其中碎赢,自然就不會觸碰到全局對象了。如果你需要全局對象速梗,那就 pass 給 IIFE:
(function (global) {
// 在這里肮塞,global 就是全局對象了
})(this) // 在瀏覽器里,this 就是 window 對象
2.IIFE 還可確保你的代碼不會輕易被其它全局命名空間里的代碼所修改(i.e. 第三方庫姻锁,window 引用枕赵,被覆蓋的未定義的關(guān)鍵字等等)。
IIFE一般用在什么地方
1.無論何時(shí)位隶,想要?jiǎng)?chuàng)建一個(gè)新的封閉的定義域拷窜,那就用 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)有效疚颊。如果我們只是在某個(gè)代碼塊中使用某個(gè)變量,我們可以使用let信认,再也不需要使用IIFE了:
{
let private = 1;
}
console.log(private); // 未捕獲 ReferenceError