這兩天經理讓我出一套js的面試題,我本身都是個剛進入前端的菜鳥,這怎麼辦啊,趕忙補基礎唄。正好這兩天項目也作完了,趕忙補充一下基礎,臨時抱拂腳,不能徹底運用,至少也能說出點東西來吧。首先研究的就是js的當即執行函數,之前以爲那叫一個高級啊,有時候用加號有時候用括號,在代碼中能夠直接執行,仔細看看原來這麼簡單,這裏總結一下吧。前端
1.語法面試
一般咱們使用的是兩種(function(){})()或者是(function(){}()),但其實包裹function的那層小括號能夠用不少運算符來代替,什麼+,-,!啦之類的等等運算符,甚至void,new也能夠將其轉換爲函數表達式,而後再加"()"當即執行。segmentfault
2.爲何必定要使用IIFE(Imdiately Invoked Function Expression)瀏覽器
a)傳統的方法囉嗦,定義和執行分開寫函數
b)傳統的方法直接污染全局命名空間
通常來講定義函數有兩種方式this
//函數聲明語句寫法 function test(){}; test(); //函數表達式寫法 var test = function(){}; test();
不難看出,其實在函數後面用()便是調用該函數,那麼能不能寫function test(){}()呢?答案是不能,由於function test(){}這個部分只是一個聲明,對於解釋器來講,就好像你寫了一個字符串 "function test(){}"
,它須要使用解析函數,好比eval()
來執行它才能夠。因此把 () 直接放在聲明後面是不會執行,這是錯誤的語法。變正確的方式很簡單,只須要把聲明變成 表達式(Expression)就能夠了。最多見的辦法就是用()括起來,因此纔有上述第一點中不少運算符都能當即執行,由於都將聲明變成了表達式。spa
3.參數code
當即執行函數不去污染全局命名空間,是由於 IIFE 建立了一個新的函數做用域。若是你須要全局對象,那就 pass 給 IIFE。對象
(function (global) { // 在這裏,global就是全局對象了 })(this)// 在瀏覽器裏,this就是 window 對象
4.使用時機blog
a)當咱們須要寫一個js文件,而且複用率很高的時候,建議使用。
b)若是聲明的函數只須要調用一次,建議使用。
c)獨立模塊,這個和第一點差很少。單獨提出來,是想強調一下當即執行函數的好處,開發時,它能作到各模塊的低耦合,減小對全局做用域的污染。
p.s:其實不少人也叫當即執行函數爲匿名函數,其實當即執行函數能夠有函數名的哦,不信你本身試試吧。
參考連接:
https://segmentfault.com/q/1010000000442042