成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

「JavaScript」函數(shù)聲明和函數(shù)表達(dá)式

Kerr1Gan / 491人閱讀

摘要:函數(shù)表達(dá)式的值是在運(yùn)行時(shí)確定,并且在表達(dá)式賦值完成后,該函數(shù)才能調(diào)用

1.定義

在javascript中我們定義函數(shù)有以下兩種方式:

函數(shù)聲明

  function say(){
     console.log("函數(shù)聲明");
  }

函數(shù)表達(dá)式

   var say = function(){
      console.log("函數(shù)表達(dá)式");
   }
2.實(shí)例解析

在平時(shí)開發(fā)中,它們有著難以察覺的差別,我們看下下面的例子:

    say();
    var say = function(){
          console.log("函數(shù)表達(dá)式");
    }
    say();
    function say(){
     console.log("函數(shù)聲明");
    }
    say();

可以先在腦海中想一下答案,執(zhí)行結(jié)果是:

函數(shù)聲明
函數(shù)表達(dá)式
函數(shù)表達(dá)式

來,我們分析一下這個(gè)結(jié)果:

1.第一次調(diào)用say函數(shù)時(shí),函數(shù)還未被定義,那為什么可以打印出“函數(shù)聲明”這個(gè)值呢?原因在于

javascript解釋器中存在一種變量聲明被提升的機(jī)制,也就是說函數(shù)聲明會被提升到作用域的最前面,即使寫代碼的時(shí)候是寫在最后面,也還是會被提升至最前面。
而用函數(shù)表達(dá)式創(chuàng)建的函數(shù)是在運(yùn)行時(shí)進(jìn)行賦值,且要等到表達(dá)式賦值完成后才能調(diào)用

因此,即使函數(shù)還未被定義,但是函數(shù)聲明已經(jīng)被提升到最前面了,上面那段代碼相當(dāng)于:

    var say; //變量被提升,此時(shí)的值為undefined
    say();// 函數(shù)被提升,輸出“函數(shù)聲明”
    var say = function(){
          console.log("函數(shù)表達(dá)式");
    }
    say();
    function say(){
     console.log("函數(shù)聲明");
    }
    say();

從下面兩個(gè)的對比,更能理解“函數(shù)聲明提升”這個(gè)概念:
1.

var say;
console.log(say);
say();
function say(){
   console.log("函數(shù)聲明");
}

輸出:
f say(){
   console.log("函數(shù)聲明");
}
函數(shù)聲明

2.

var say;
console.log(say);
say();
var say = function(){
   console.log("函數(shù)表達(dá)式");
}

輸出:
undefined
Uncaught TypeError: say is not a function
    at :3:1

2.第二次調(diào)用say函數(shù)時(shí),我們可以先簡單理解為此時(shí)的函數(shù)表達(dá)式覆蓋了函數(shù)聲明,因此輸出了‘函數(shù)表達(dá)式’,然而到了第三次調(diào)用say函數(shù)時(shí),此時(shí)打印的竟然還是‘函數(shù)表達(dá)式’??為什么后面的函數(shù)聲明沒有覆蓋前面的函數(shù)表達(dá)式呢?其實(shí)在運(yùn)行時(shí)由于函數(shù)聲明提升的原因,實(shí)際上運(yùn)行的順序是類似于這樣的:

var say; //函數(shù)表達(dá)式中的var提前,值為undefined

function say() {
    console.log("函數(shù)聲明");
}//因?yàn)楹瘮?shù)聲明提升,所以在最前面運(yùn)行了

say(); //函數(shù)聲明
say = function() { //給say賦值函數(shù)
    console.log("函數(shù)表達(dá)式");
}
say();//函數(shù)表達(dá)式
say();//函數(shù)表達(dá)式
3.總結(jié)

1.函數(shù)聲明在JS解析時(shí)進(jìn)行函數(shù)提升,因此在同一個(gè)作用域內(nèi),不管函數(shù)聲明在哪里定義,該函數(shù)都可以進(jìn)行調(diào)用。
2.函數(shù)表達(dá)式的值是在JS運(yùn)行時(shí)確定,并且在表達(dá)式賦值完成后,該函數(shù)才能調(diào)用

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

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/96136.html

相關(guān)文章

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

    摘要:要理解立即執(zhí)行函數(shù),需要先理解一些函數(shù)的基本概念。函數(shù)表達(dá)式使用關(guān)鍵字聲明一個(gè)函數(shù),但未給函數(shù)命名,最后將匿名函數(shù)賦予一個(gè)變量,叫函數(shù)表達(dá)式,這是最常見的函數(shù)表達(dá)式語法形式。 javascript和其他編程語言相比比較隨意,所以javascript代碼中充滿各種奇葩的寫法,有時(shí)霧里看花,當(dāng)然,能理解各型各色的寫法也是對javascript語言特性更進(jìn)一步的深入理解。 ( functio...

    melody_lql 評論0 收藏0
  • 【滲透】關(guān)于Javascript函數(shù)聲明函數(shù)達(dá)式

    摘要:而函數(shù)表達(dá)式的值是在運(yùn)行時(shí)確定,并且在表達(dá)式賦值完成后,該函數(shù)才能調(diào)用。 Javascript定義函數(shù)有兩種類型 函數(shù)聲明 // 函數(shù)聲明 function wscat(type){ return type===wscat; } 函數(shù)表達(dá)式 // 函數(shù)表達(dá)式 var oaoafly = function(type){ return type===oaoafly; } 先...

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

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

    FleyX 評論0 收藏0
  • js中(function(){…})()立即執(zhí)行函數(shù)寫法理解

    摘要:和是兩種立即執(zhí)行函數(shù)的常見寫法,最初我以為是一個(gè)括號包裹匿名函數(shù),再在后面加個(gè)括號調(diào)用函數(shù),最后達(dá)到函數(shù)定義后立即執(zhí)行的目的,后來發(fā)現(xiàn)加括號的原因并非如此。 javascript和其他編程語言相比比較隨意,所以javascript代碼中充滿各種奇葩的寫法,有時(shí)霧里看花,當(dāng)然,能理解各型各色的寫法也是對javascript語言特性更進(jìn)一步的深入理解。 ( function(){…} )...

    YJNldm 評論0 收藏0
  • 先有蛋還是先有雞?JavaScript 作用域與閉包探析

    摘要:而閉包的神奇之處正是可以阻止事情的發(fā)生。拜所聲明的位置所賜,它擁有涵蓋內(nèi)部作用域的閉包,使得該作用域能夠一直存活,以供在之后任何時(shí)間進(jìn)行引用。依然持有對該作用域的引用,而這個(gè)引用就叫閉包。 引子 先看一個(gè)問題,下面兩個(gè)代碼片段會輸出什么? // Snippet 1 a = 2; var a; console.log(a); // Snippet 2 console.log(a); v...

    elisa.yang 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<