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)輸出的值是1到6,而不是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é)果是1到6,而不是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é)果是1到6。
很多小伙伴在看這段代碼的時(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ì)的地方,歡迎小伙伴們多多指正。
謝謝大家~ ??