js當即執行函數

  這兩天經理讓我出一套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

相關文章
相關標籤/搜索