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

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

    • 分享

      理解javascript中的立即執(zhí)行函數(shù)(function(){})()

       沙門(mén)空海 2018-12-11

      之前看了好多代碼,都有用到這種函數(shù)的寫(xiě)法,但是都沒(méi)認(rèn)真的去想為什么會(huì)這樣寫(xiě),今天開(kāi)始想學(xué)習(xí)下jquery的源碼,發(fā)現(xiàn)jquery也是使用這種方式,用(function(window, undefined){})(window)包裹內(nèi)部代碼,于是進(jìn)一步的去學(xué)習(xí)了下。

      要理解立即執(zhí)行函數(shù)(function(){})(),先了解些函數(shù)的基本概念(函數(shù)聲明、函數(shù)表達(dá)式、匿名函數(shù))。

      函數(shù)聲明:使用function聲明函數(shù),并指定函數(shù)名。 

      function setFn() {
          // coding   
      }

      函數(shù)表達(dá)式:使用function聲明函數(shù),但未指定函數(shù)名,將匿名函數(shù)賦予一個(gè)變量。

      var setFn = function() {
          // coding
      }

      匿名函數(shù):使用function關(guān)鍵字聲明函數(shù),但未指定函數(shù)名。匿名函數(shù)屬于函數(shù)表達(dá)式,匿名函數(shù)有很多作用,賦予一個(gè)變量則創(chuàng)建函數(shù),賦予一個(gè)事件則成為事件處理程序或創(chuàng)建閉包等等。

      function() {
          // coding
      }

      函數(shù)聲明與函數(shù)表達(dá)式的不同在于:

      1. 函數(shù)聲明可在當(dāng)前作用域下提前調(diào)用執(zhí)行,函數(shù)表達(dá)式需等執(zhí)行到該函數(shù)后,方可執(zhí)行,不可提前調(diào)用。

      復(fù)制代碼
      setFn()
      function setFn() {
          // coding  
      }
      // 正常,函數(shù)聲明可提前調(diào)用
      
      setFn()
      var setFn = function() {
          // coding
      } 
      // 報(bào)錯(cuò),setFn未保存對(duì)函數(shù)的引用,函數(shù)調(diào)用需放在函數(shù)表達(dá)式后面
      復(fù)制代碼

      2. 函數(shù)表達(dá)式可直接在函數(shù)后加括號(hào)調(diào)用。

      var setFn = function() {
          console.log(2)
      }()
      
      // 2   解析至此,可直接執(zhí)行調(diào)用

      立即執(zhí)行函數(shù)(function(){})()可以看出很像函數(shù)表達(dá)式的調(diào)用,但為什么要加括號(hào)呢?如果不加括號(hào):

      復(fù)制代碼
      function(){
          console.log(1)
      }()
      
      // 報(bào)錯(cuò),函數(shù)需要函數(shù)名

      解析: 雖然匿名函數(shù)屬于函數(shù)表達(dá)式,但未進(jìn)行賦值,所以javascript解析時(shí)將開(kāi)頭的function當(dāng)做函數(shù)聲明,故報(bào)錯(cuò)提示需要函數(shù)名
      復(fù)制代碼

      立即執(zhí)行函數(shù)里面的函數(shù)必須是函數(shù)表達(dá)式,所以由var setFn = function() {}()可以理解為在匿名函數(shù)前加了 = 運(yùn)算符后,將函數(shù)聲明轉(zhuǎn)化為函數(shù)表達(dá)式,所以拿!,+,-,()...等運(yùn)算符來(lái)測(cè)試下是否如此。

      復(fù)制代碼
      !function(){
          console.log(1)
      }()
      // 1
          
      +function(){
          console.log(2)
      }()
      // 2
          
      -function(){
          console.log(3)
      }()
      // 3
          
      (function(){
          console.log(4)
      })()
      // 4
      復(fù)制代碼

       

      由此可見(jiàn),加運(yùn)算符確實(shí)可將函數(shù)聲明轉(zhuǎn)化為函數(shù)表達(dá)式,而之所以使用括號(hào),是因?yàn)槔ㄌ?hào)相對(duì)其他運(yùn)算符會(huì)更安全,可以減少不必要的麻煩。

      立即執(zhí)行函數(shù)與正常函數(shù)傳參形式是一致的。

      (function(a, b){
          console.log(a + b);
      })(1, 2)
      // 3

      (function(){}())這樣寫(xiě)的好處是在內(nèi)部定義的變量不會(huì)跟外部的變量有沖突,達(dá)到保護(hù)內(nèi)部變量的作用。

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

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多