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

資訊專欄INFORMATION COLUMN

【滲透】關(guān)于Javascript的函數(shù)聲明和函數(shù)表達(dá)式

zhaochunqi / 3482人閱讀

摘要:而函數(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";
}

先看下面這個(gè)經(jīng)典問(wèn)題,在一個(gè)程序里面同時(shí)用函數(shù)聲明和函數(shù)表達(dá)式定義一個(gè)名為getName的函數(shù)

    getName()//oaoafly
    var getName = function() {
        console.log("wscat")
    }
    getName()//wscat
    function getName() {
        console.log("oaoafly")
    }
    getName()//wscat

上面的代碼看起來(lái)很類似,感覺(jué)也沒(méi)什么太大差別。但實(shí)際上,Javascript函數(shù)上的一個(gè)“陷阱”就體現(xiàn)在Javascript兩種類型的函數(shù)定義上。

JavaScript 解釋器中存在一種變量聲明被提升的機(jī)制,也就是說(shuō)函數(shù)聲明會(huì)被提升到作用域的最前面,即使寫代碼的時(shí)候是寫在最后面,也還是會(huì)被提升至最前面。
而用函數(shù)表達(dá)式創(chuàng)建的函數(shù)是在運(yùn)行時(shí)進(jìn)行賦值,且要等到表達(dá)式賦值完成后才能調(diào)用
    var getName//變量被提升,此時(shí)為undefined
    
    getName()//oaoafly 函數(shù)被提升 這里受函數(shù)聲明的影響,雖然函數(shù)聲明在最后可以被提升到最前面了
    var getName = function() {
        console.log("wscat")
    }//函數(shù)表達(dá)式此時(shí)才開(kāi)始覆蓋函數(shù)聲明的定義
    getName()//wscat
    function getName() {
        console.log("oaoafly")
    }
    getName()//wscat 這里就執(zhí)行了函數(shù)表達(dá)式的值

所以可以分解為這兩個(gè)簡(jiǎn)單的問(wèn)題來(lái)看清楚區(qū)別的本質(zhì)

    var getName;
    console.log(getName)//undefined
    getName()//Uncaught TypeError: getName is not a function
    var getName = function() {
        console.log("wscat")
    }
            var getName;
    console.log(getName)//function getName() {console.log("oaoafly")}
    getName()//oaoafly
    function getName() {
        console.log("oaoafly")
    }
這個(gè)區(qū)別看似微不足道,但在某些情況下確實(shí)是一個(gè)難以察覺(jué)并且“致命“的陷阱。出現(xiàn)這個(gè)陷阱的本質(zhì)原因體現(xiàn)在這兩種類型在函數(shù)提升和運(yùn)行時(shí)機(jī)(解析時(shí)/運(yùn)行時(shí))上的差異。
當(dāng)然我們最后要給一個(gè)總結(jié):Javascript中函數(shù)聲明和函數(shù)表達(dá)式是存在區(qū)別的,函數(shù)聲明在JS解析時(shí)進(jìn)行函數(shù)提升,因此在同一個(gè)作用域內(nèi),不管函數(shù)聲明在哪里定義,該函數(shù)都可以進(jìn)行調(diào)用。而函數(shù)表達(dá)式的值是在JS運(yùn)行時(shí)確定,并且在表達(dá)式賦值完成后,該函數(shù)才能調(diào)用。這個(gè)微小的區(qū)別,可能會(huì)導(dǎo)致JS代碼出現(xiàn)意想不到的bug,讓你陷入莫名的陷阱中。

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

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

相關(guān)文章

  • 重讀你不知道JS (上) 第一節(jié)四章

    摘要:如果提升改變了代碼執(zhí)行的順序,會(huì)造成非常嚴(yán)重的破壞。聲明本身會(huì)被提升,而包括函數(shù)表達(dá)式的賦值在內(nèi)的賦值操作并不會(huì)提升。要注意避免重復(fù)聲明,特別是當(dāng)普通的聲明和函數(shù)聲明混合在一起的時(shí)候,否則會(huì)引起很多危險(xiǎn)的問(wèn)題 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡(jiǎn)單易用的語(yǔ)言,又是一門具有許多復(fù)雜微妙技術(shù)的語(yǔ)言,即使是經(jīng)驗(yàn)豐富的 Ja...

    chanjarster 評(píng)論0 收藏0
  • 重讀你不知道JS (上) 第一節(jié)三章

    摘要:如果是聲明中的第一個(gè)詞,那么就是一個(gè)函數(shù)聲明,否則就是一個(gè)函數(shù)表達(dá)式。給函數(shù)表達(dá)式指定一個(gè)函數(shù)名可以有效的解決以上問(wèn)題。始終給函數(shù)表達(dá)式命名是一個(gè)最佳實(shí)踐。也有開(kāi)發(fā)者干脆關(guān)閉了靜態(tài)檢查工具對(duì)重復(fù)變量名的檢查。 你不知道的JS(上卷)筆記 你不知道的 JavaScript JavaScript 既是一門充滿吸引力、簡(jiǎn)單易用的語(yǔ)言,又是一門具有許多復(fù)雜微妙技術(shù)的語(yǔ)言,即使是經(jīng)驗(yàn)豐富的 Ja...

    lavor 評(píng)論0 收藏0
  • 譯: 函數(shù)提升與提升面試相關(guān)問(wèn)題

    摘要:函數(shù)提升在里有兩種方式創(chuàng)建函數(shù),通過(guò)函數(shù)聲明和函數(shù)表達(dá)式。函數(shù)聲明用指定的參數(shù)來(lái)定義函數(shù)。提示不要在中進(jìn)行函數(shù)聲明。問(wèn)題輸出兩個(gè)都是用函數(shù)聲明的函數(shù),將被提升到的局部作用域頂端。函數(shù)本身將作為函數(shù)聲明在全局范圍內(nèi)提升。 作者關(guān)于提升的話題,總共有兩篇。(后來(lái)又有一個(gè)討論篇),再次搬過(guò)來(lái)。水平有限,如果翻譯的不準(zhǔn)確請(qǐng)包涵,并去看原文。下面開(kāi)始: 這是我之前的關(guān)于提升的文章,標(biāo)題為《用le...

    wuaiqiu 評(píng)論0 收藏0
  • JavaScript函數(shù)(二)

    摘要:目錄函數(shù)的聲明函數(shù)的屬性和方法函數(shù)的作用域閉包知識(shí)點(diǎn)小結(jié)關(guān)于函數(shù),可以從以下個(gè)方面去理解首先,數(shù)據(jù)類型上看函數(shù)在中是一種數(shù)據(jù)類型,是對(duì)象的一種其次,從功能上看函數(shù)本質(zhì)上是一段反復(fù)調(diào)用的代碼塊最后,從地位上看函數(shù)在中和其他基本數(shù)據(jù)類型一樣,可 目錄 1.函數(shù)的聲明 2.函數(shù)的屬性和方法 3.函數(shù)的作用域 4.閉包知識(shí)點(diǎn) 5.小結(jié) 關(guān)于函數(shù),可以從以下3個(gè)方面去理解:首先,數(shù)據(jù)類型上看:...

    用戶84 評(píng)論0 收藏0
  • 淺談對(duì)JavaScript閉包理解

    摘要:關(guān)于循環(huán)和閉包當(dāng)循環(huán)和閉包結(jié)合在一起時(shí),經(jīng)常會(huì)產(chǎn)生讓初學(xué)者覺(jué)得匪夷所思的問(wèn)題。閉包是一把雙刃劍是比較難以理解和掌握的部分,它十分強(qiáng)大,卻也有很大的缺陷,如何使用它完全取決于你自己。 在談閉包之前,我們首先要了解幾個(gè)概念: 什么是函數(shù)表達(dá)式? 與函數(shù)聲明有何不同? JavaScript查找標(biāo)識(shí)符的機(jī)制 JavaScript的作用域是詞法作用域 JavaScript的垃圾回收機(jī)制 先來(lái)...

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

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

0條評(píng)論

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