全網(wǎng)最易懂版:什么是立即執(zhí)行函數(shù)?有什么作用?

2020年3月12日
《每日一題系列??》
作者:王二狗
博客:掘金思否、知乎簡(jiǎn)書、CSDN
點(diǎn)贊再看,養(yǎng)成習(xí)慣,每日一題系列會(huì)一直更新下去,你們的支持是我持續(xù)分享的最大動(dòng)力??

什么是立即執(zhí)行函數(shù)?

要成為立即執(zhí)行函數(shù),需要滿足兩個(gè)條件:

  • 聲明一個(gè)匿名函數(shù)
  • 立馬調(diào)用這個(gè)匿名函數(shù)

比如,下面就是一個(gè)非常典型的立即執(zhí)行函數(shù):

(function(){console.log('這是一個(gè)立即執(zhí)行函數(shù)'))()

//首先聲明一個(gè)匿名函數(shù)(function(){console.log('這是一個(gè)立即執(zhí)行函數(shù)'))
//然后再匿名函數(shù)的后面接一對(duì)括號(hào)(),立馬調(diào)用這個(gè)函數(shù)

大多數(shù)小伙伴不理解的可能是為什么要把匿名函數(shù)用一對(duì)括號(hào)包起來(lái)。

其實(shí),這么做的目的是為了兼容JS的語(yǔ)法。

除了使用一對(duì)括號(hào)之外,我們還可以使用下面的語(yǔ)法:

(function(){alert('我是匿名函數(shù)')} ()) 
(function(){alert('我是匿名函數(shù)')}) ()
!function(){alert('我是匿名函數(shù)')}() 
+function(){alert('我是匿名函數(shù)')}()
-function(){alert('我是匿名函數(shù)')}()
~function(){alert('我是匿名函數(shù)')}()
void function(){alert('我是匿名函數(shù)')}()
new function(){alert('我是匿名函數(shù)')}()

立即執(zhí)行函數(shù)有什么作用?

立即執(zhí)行函數(shù)的作用只有一個(gè),那就是創(chuàng)建獨(dú)立的作用域。
讓外部無(wú)法訪問(wèn)作用域內(nèi)部的變量,從而避免變量污染。

比如下面的代碼,我們就可以使用立即執(zhí)行函數(shù)讓for循環(huán)輸出的值是16,而不是6個(gè)6

for(var i=0; i<6; i++){
  !function(i){//這個(gè)i是獨(dú)立作用域里面的i
        console.log(i)//這個(gè)i是獨(dú)立作用域里面的i
    }
  }(i)//這個(gè)i是for循環(huán)中的i
}

上面的代碼之所以輸出的結(jié)果是16,而不是6個(gè)6,是因?yàn)槲覀兠看味紝?code>for循環(huán)中的i單獨(dú)賦值給了for循環(huán)內(nèi)部的i

每一次for循環(huán)內(nèi)i值變化的時(shí)候,我們都立即執(zhí)行函數(shù)在for循環(huán)內(nèi)部創(chuàng)建了一個(gè)獨(dú)立的作用域,所以最終輸出的結(jié)果是16。

很多小伙伴在看這段代碼的時(shí)候都容易被里面的i值所混淆,其實(shí)兩個(gè)i并不是同一個(gè)值。

下面的代碼會(huì)讓你更加容易理解:

for(var i=0; i<6; i++){
  !function(j){
    console.log(j)
  }(i)
}

告誡自己,即使再累也不要忘記學(xué)習(xí),成功沒(méi)有捷徑可走,只有一步接著一步走下去。 共勉!

文章中如有不對(duì)的地方,歡迎小伙伴們多多指正。

謝謝大家~ ??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容