成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

_Suqin / 1051人閱讀

摘要:有兩種定義函數(shù)的方式函數(shù)聲明與函數(shù)表達(dá)式。所以在實(shí)際開發(fā)的時候,一定要注意變量函數(shù)的聲明會被提升到當(dāng)前作用域的最前面

JS有兩種定義函數(shù)的方式:函數(shù)聲明與函數(shù)表達(dá)式。那么這兩種方式有區(qū)別嗎,還是一樣的呢?下面我們來進(jìn)一步探討探討。

下面我們定義了兩個函數(shù)分別為 hello 和 hi,前者采用函數(shù)聲明,后者采用函數(shù)表達(dá)式,然后再調(diào)用,如下:

function hello () {
    console.log("Hello the world");
}

var hi = function () {
    console.log("Hi, IMWeb");
}

hello(); // "Hello the world"
hi(); // "Hi, IMWeb"

上面的調(diào)用,我們都能得到正確的運(yùn)行,并沒有什么區(qū)別。但是如果我們把順序掉下,先調(diào)用函數(shù)后定義函數(shù),那么情況就會有點(diǎn)不一樣了。如下:

hello(); // "Hello the world"
hi(); // Uncaught TypeError: hi is not a function

function hello () {
    console.log("Hello the world");
}

var hi = function () {
    console.log("Hi, IMWeb");
}

從上我們可以看到,hello 函數(shù)可以照常運(yùn)行,但是我們的 hi 函數(shù)就會報錯了。根據(jù)報錯“Uncaught TypeError: hi is not a function”,我們知道 hi 不是 function 了,那又是什么呢?我們繼續(xù)使用 typeof 查看下:

console.log(typeof hello); // function
console.log(typeof hi); // undefined

function hello () {
    console.log("Hello the world");
}

var hi = function () {
    console.log("Hi, IMWeb");
}
function hello () {
    console.log("Hello the world");
}
var hi;

console.log(typeof hello); // function
console.log(typeof hi); // undefined

hi = function () {
    console.log("Hi, IMWeb");
}

通過 typeof 我們可以看到 hi 現(xiàn)在是個 undefined 了,這是為什么呢?

這是因?yàn)?JavaScript 解釋器中存在一種變量聲明被提升(hoisting)的機(jī)制,也就是說變量(函數(shù))的聲明會被提升到當(dāng)前作用域的最前面,即使寫代碼的時候是寫在最后面,也還是會被提升至最前面。

這樣上面的例子在執(zhí)行的時候就成了這樣的:

這樣是不是一下就恍然大悟了。所以在實(shí)際開發(fā)的時候,一定要注意變量(函數(shù))的聲明會被提升到當(dāng)前作用域的最前面

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92863.html

相關(guān)文章

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

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

    TerryCai 評論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
  • 函數(shù)聲明函數(shù)達(dá)式區(qū)別

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

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

    摘要:,在這里的將所有的函數(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)頂部(塊級作用域空間) function test()...

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

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

    madthumb 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<