乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      立即執(zhí)行函數(shù): (function ( ){...})( ) 與 (function ( ){...}( )) 有什么區(qū)別?

       ThinkTank_引擎 2015-12-14

      4 個回答

      15
      采納
      nightire 21.5k 2014年03月22日 回答 · 2014年03月22日 更新

      沒有區(qū)別。

      你需要明白 IIFE 的原理,我簡單說一下:

      function foo() {...}     // 這是定義,Declaration;定義只是讓解釋器知道其存在,但是不會運行。
      
      foo();                   // 這是語句,Statement;解釋器遇到語句是會運行它的。
      

      IIFE 并非必須,傳統(tǒng)一點可以這么寫:

      function foo() {...}
      foo();
      

      那么為什么要 IIFE?

      1. 傳統(tǒng)的方法啰嗦,定義和執(zhí)行分開寫;
      2. 傳統(tǒng)的方法直接污染全局命名空間(瀏覽器里的 global 對象,如 window

      于是,開發(fā)者們想找一個可以解決以上問題的寫法。那么像下面這么寫行不行呢?

      function foo(...){}();
      

      當(dāng)然是不能,但是為什么呢?因為 function foo(...){} 這個部分只是一個聲明,對于解釋器來說,就好像你寫了一個字符串 "function foo(...){}",它需要使用解析函數(shù),比如 eval() 來執(zhí)行它才可以。所以把 () 直接放在聲明后面是不會執(zhí)行,這是錯誤的語法。

      如何把它變得正確?說起來也簡單,只要把 聲明 變成 表達(dá)式(Expression) 就可以了。

      實際上轉(zhuǎn)變表達(dá)式的辦法還是很多的,最常見的辦法是把函數(shù)聲明用一對 () 包裹起來,于是就變成了:

      (function foo() {...})    // 這里是故意換行,實際上可以和下面的括號連起來
      ();
      

      這就等價于:

      var foo = function () {...};    // 這就不是定義,而是表達(dá)式了。
      foo();
      

      但是之前我們說不行的那個寫法,其實也可以直接用括號包起來,這也是一種等價的表達(dá)式:

      (function foo(){...}());
      

      所以你問有沒有區(qū)別?很簡單:木有~

      另外,剛才說過轉(zhuǎn)變表達(dá)式的方式很多,的確還有很多別的寫法,比如:

      !function foo() {...}();
      

      或者

      +function foo() {...}();
      

      這些都可以。

      我個人挺偏愛用 void 來轉(zhuǎn)變表達(dá)式,因為此關(guān)鍵字不會有返回值。不過這一點真的沒有什么要緊的,就當(dāng)我“龜毛”好了……

      void function () {
          // 這里是真正需要的代碼
      }();
      

      OK,所謂不去污染全局命名空間,是因為 IIFE 創(chuàng)建了一個新的函數(shù)作用域,你真正的業(yè)務(wù)代碼被封裝在其中,自然就不會觸碰到全局對象了。如果你需要全局對象,那就 pass 給 IIFE:

      void function (global) {
          // 在這里,global 就是全局對象了
      }(this)    // 在瀏覽器里,this 就是 window 對象
      

      我在這里寫過一個系列,其中一篇講作用域和命名提升的,里面的知識點對理解 IIFE 有幫助,有興趣的話可以繼續(xù)深入閱讀:http://blog.segmentfault.com/nightire/1190000000348228

      2
      shenwa12 31 2014年03月25日 回答

      方式一,調(diào)用函數(shù),得到返回值。強制函數(shù)直接量執(zhí)行再返回一個引用,引用在去調(diào)用執(zhí)行
      方式二,調(diào)用函數(shù),得到返回值。強制運算符使函數(shù)調(diào)用執(zhí)行
      (function(){})(); 是 把函數(shù)當(dāng)作表達(dá)式解析,然后執(zhí)行解析后的函數(shù)
      相當(dāng)于 var a = function(){}; a(); a得到的是函數(shù)
      (function(){}()); 是把函數(shù)表達(dá)式和執(zhí)行當(dāng)作語句直接執(zhí)行、
      相當(dāng)于 var a = function(){}(); a得到的是結(jié)果
      最終結(jié)果是一樣的、
      ()只是起了 自執(zhí)行的作用
      和 () 一樣的還有很多
      比如 +function (){}
      這個等于 (function (){}) 一般用(function (){}) 還有個作用,就是 避免全局變量

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多