国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別

浠ラ箍 / 3026人閱讀

摘要:,在這里的將所有的函數(shù)聲明進(jìn)行了提升,從而由替代了函數(shù)表達(dá)式的在順著條件判斷進(jìn)行了定義,執(zhí)行為的情況,進(jìn)行賦值解析。

函數(shù)聲明(funDeclaration)

無論在哪兒定義函數(shù),只要是外層函數(shù)并且滿足不被包裹,就都可以進(jìn)行全局范圍的調(diào)用

function foo() { }

在函數(shù)體內(nèi)部的函數(shù)聲明無法提升到全局,只能提升到函數(shù)體內(nèi)頂部(塊級(jí)作用域空間)

function test() {
    console.log(1);

    function test2() {
      console.log(2);
    }

  }
  test();  // 1
  test2(); // Uncaught ReferenceError: test2 is not defined

函數(shù)體內(nèi)部執(zhí)行:

function test() {
   
    test2();
    function test2() {
      console.log(2);
    }
  }
  test(); // 2

在外部要想訪問函數(shù)內(nèi)部申明的函數(shù),需要先return出來:

function test() {
    console.log(1);

    function test2() {
      console.log(2);
    }
    return {
      test2:test2
    }
  }
  test().test2(); // 2
函數(shù)表達(dá)式(funExpression)

函數(shù)表達(dá)式需要等到表達(dá)式賦值 完成 才可以

換言之使用var來聲明函數(shù),就會(huì)涉及到變量的聲明提升,先拿出變量名定義為undefined,再隨著邏輯順序進(jìn)行賦值先定義,后使用
var foo = function () { }
demo1
    Toast()    // hello world

    showToast(); // shwoToast is not a function

    var showToast = function () {
      console.log("123")
    }
    function Toast() {
      console.log("hello world") 
    }
在這里只需要把showToast 提前就好了
demo2 主流瀏覽器解析,ie11+
 var sayHello;
    console.log(typeof (sayHey));//=>undefined   
    console.log(typeof (sayHo));//=>undefined
    if (true) {
      function sayHey() {
        console.log("sayHey");
      }
      sayHello = function sayHo() {
        console.log("sayHello");
      }
    } else {
      function sayHey() {
        console.log("sayHey2");
      }
      sayHello = function sayHo() {
        console.log("sayHello2");
      }
    }
    sayHey();// => sayHey   
    sayHello();// => sayHello

在花括號(hào)里面聲明的函數(shù)在進(jìn)行預(yù)解析時(shí)只會(huì)提升函數(shù)名,不會(huì)提升函數(shù)體,所以不管if條件是否為真,函數(shù)體都不會(huì)提升,永遠(yuǎn)是undefined,接下來隨著if條件判斷進(jìn)行解析賦值,當(dāng)然是走ture方法。

ie9,ie10
var sayHello;
    console.log(typeof (sayHey));//=>function    
    console.log(typeof (sayHo));//=>undefined
    if (true) {
        function sayHey() {
            console.log("sayHey");
        }
        sayHello = function sayHo() {
            console.log("sayHello");
    }
    } else {
        function sayHey() {
            console.log("sayHey2");
        }
        sayHello = function sayHo() {
            console.log("sayHello2");
        }
    }    
    sayHey();// => sayHey2    
    sayHello();// => sayHello

在這里的ie將所有的函數(shù)聲明進(jìn)行了提升,從而由sayHey2替代了sayHey,函數(shù)表達(dá)式的在順著條件判斷進(jìn)行了定義,執(zhí)行為true的情況,進(jìn)行賦值解析。

ie8
var sayHello;
    console.log(typeof (sayHey));//=>function    
    console.log(typeof (sayHello));//=>function
    if (true) {
        function sayHey() {
            console.log("sayHey");
        }
        sayHello = function sayHo() {
            console.log("sayHello");
    }
    } else {
        function sayHey() {
            console.log("sayHey2");
        }
        sayHello = function sayHo() {
            console.log("sayHello2");
        }
    }    
    sayHey();// => sayHey2    
    sayHello();// => sayHello

ie8在這里處理的比較奇葩,正常的函數(shù)申明提升,但是卻也將條件判斷為假的情況進(jìn)行了提升,我們看到typeof (sayHello)=>function

結(jié)論

由于函數(shù)聲明提升的差異,想要在條件判斷中定義不同的函數(shù)方法,應(yīng)該采用定義函數(shù)表達(dá)式的方法,這樣就在各個(gè)瀏覽器中拿到相同的函數(shù)方法,得到相同的結(jié)果。

 var sayHello;
    console.log(typeof (sayHey));//=>undefined    ie8以下解析為function
    console.log(typeof (sayHo));//=>undefined
    if (true) {
      var sayHey =function sayHey() {
        console.log("sayHey");
      }
     
    } else {
      var sayHey =function sayHey() {
        console.log("sayHey2");
      }
     
    }
    sayHey();// => sayHey   
參考

http://www.cnblogs.com/isaboy...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/93786.html

相關(guān)文章

  • JS基礎(chǔ)篇--函數(shù)聲明定義,作用域,函數(shù)聲明達(dá)式區(qū)別

    摘要:在中,有四種方式可以讓命名進(jìn)入到作用域中按優(yōu)先級(jí)語言定義的命名比如或者,它們?cè)谒凶饔糜騼?nèi)都有效且優(yōu)先級(jí)最高,所以在任何地方你都不能把變量命名為之類的,這樣是沒有意義的形式參數(shù)函數(shù)定義時(shí)聲明的形式參數(shù)會(huì)作為變量被至該函數(shù)的作用域內(nèi)。 Scoping & Hoisting 例: var a = 1; function foo() { if (!a) { var ...

    TerryCai 評(píng)論0 收藏0
  • 函數(shù)聲明函數(shù)達(dá)式區(qū)別

    摘要:有兩種定義函數(shù)的方式函數(shù)聲明與函數(shù)表達(dá)式。所以在實(shí)際開發(fā)的時(shí)候,一定要注意變量函數(shù)的聲明會(huì)被提升到當(dāng)前作用域的最前面 JS有兩種定義函數(shù)的方式:函數(shù)聲明與函數(shù)表達(dá)式。那么這兩種方式有區(qū)別嗎,還是一樣的呢?下面我們來進(jìn)一步探討探討。 下面我們定義了兩個(gè)函數(shù)分別為 hello 和 hi,前者采用函數(shù)聲明,后者采用函數(shù)表達(dá)式,然后再調(diào)用,如下: function hello () { ...

    _Suqin 評(píng)論0 收藏0
  • JavaScript—— 函數(shù)聲明函數(shù)達(dá)式有什么不同嗎?

    摘要:函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別函數(shù)聲明只能出現(xiàn)在程序或函數(shù)體內(nèi)。所以,在等語義為語句的代碼塊中存在函數(shù)聲明,由于函數(shù)提升特性,會(huì)破壞掉原本的語義。 這篇談一下JS函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別及要注意的地方: 函數(shù)聲明主要有兩種類型: 函數(shù)聲明 function fn() {}; 函數(shù)表達(dá)式 var fn = function () {}; 這兩種函數(shù)創(chuàng)建方式...

    FleyX 評(píng)論0 收藏0
  • 函數(shù)聲明函數(shù)達(dá)式區(qū)別

    摘要:函數(shù)聲明函數(shù)聲明的語法說明函數(shù)聲明最重要的特征就是函數(shù)聲明提升,意思是在執(zhí)行代碼之前就會(huì)讀取函數(shù)聲明例子不會(huì)報(bào)錯(cuò),因?yàn)楹瘮?shù)聲明在在函數(shù)之前已經(jīng)讀取函數(shù)表達(dá)式函數(shù)表達(dá)式的語法說明用函數(shù)表達(dá)式定義的函數(shù)在使用之前必須先賦值例子報(bào)錯(cuò),函數(shù)調(diào)用之前 1.函數(shù)聲明 函數(shù)聲明的語法: function functionName(arg0,arg1...) { //functionBody ...

    Karrdy 評(píng)論0 收藏0
  • js中函數(shù)聲明函數(shù)達(dá)式區(qū)別以及立即執(zhí)行函數(shù)

    摘要:最近在寫代碼時(shí)遇到了閉包,其中閉包又和立即執(zhí)行函數(shù)有點(diǎn)關(guān)系,于是牽扯除了函數(shù)聲明以及函數(shù)表達(dá)式,我感覺中文的很多文章寫的不太好,查閱了的指南和這篇關(guān)于的文章,覺得寫的很好,整合一下。函數(shù)聲明和函數(shù)表達(dá)式。 最近在寫代碼時(shí)遇到了閉包,其中閉包又和立即執(zhí)行函數(shù)(immediately invoked function expression, aka IIFE)有點(diǎn)關(guān)系,于是牽扯除了函數(shù)聲明...

    madthumb 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

浠ラ箍

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<