javascript 函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別介紹
更新時間:2013年10月05日 15:15:41 作者:
javascript中的函數(shù)聲明與函數(shù)表達(dá)式使用比較頻繁,可能很多的朋友都不知道他們之間的區(qū)別,在此為大家詳細(xì)介紹下,希望對大家有所幫助
還是一樣,先上代碼:
<script>
var f = function g() {
return 1;
};
if (false) {
f = function g(){
return 2;
};
}
alert(g()); // 2
</script>
把這段代碼扔到IE 6 里面和chorme里面是完全不同的兩種效果。
這里輸出2 是在ie6里面的效果,如果在chorme會出現(xiàn)g沒有定義。
這也算是JScript的bug吧。
在這里很明顯,這里的只是定義了g的函數(shù)表達(dá)式而已。包括在if的條件語句中,也只是定義了函數(shù)表達(dá)式,沒有去聲明函數(shù)。
那么這樣直接訪問肯定是會出錯的。
那么對于何為聲明,何為函數(shù)表達(dá)式呢?
在ECMAScript中,創(chuàng)建函數(shù)的最常用的兩個方法是函數(shù)表達(dá)式和函數(shù)聲明,兩者期間的區(qū)別是有點暈,因為ECMA規(guī)范只明確了一點:函數(shù)聲明必須帶有標(biāo)示符(Identifier)(就是大家常說的函數(shù)名稱),而函數(shù)表達(dá)式則可以省略這個標(biāo)示符:
函數(shù)聲明:
function 函數(shù)名稱 (參數(shù):可選){ 函數(shù)體 }
函數(shù)表達(dá)式:
function 函數(shù)名稱(可選)(參數(shù):可選){ 函數(shù)體 }
所以,可以看出,如果不聲明函數(shù)名稱,它肯定是表達(dá)式,可如果聲明了函數(shù)名稱的話,如何判斷是函數(shù)聲明還是函數(shù)表達(dá)式呢?ECMAScript是通過上下文來區(qū)分的,如果function foo(){}是作為賦值表達(dá)式的一部分的話,那它就是一個函數(shù)表達(dá)式,如果function foo(){}被包含在一個函數(shù)體內(nèi),或者位于程序的最頂部的話,那它就是一個函數(shù)聲明。
還有一種函數(shù)表達(dá)式不太常見,就是被括號括住的(function foo(){}),他是表達(dá)式的原因是因為括號 ()是一個分組操作符,它的內(nèi)部只能包含表達(dá)式。
你可能會想到,在使用eval對JSON進(jìn)行執(zhí)行的時候,JSON字符串通常被包含在一個圓括號里:eval('(' + json + ')'),這樣做的原因就是因為分組操作符,也就是這對括號,會讓解析器強(qiáng)制將JSON的花括號解析成表達(dá)式而不是代碼塊。
復(fù)制代碼 代碼如下:
<script>
var f = function g() {
return 1;
};
if (false) {
f = function g(){
return 2;
};
}
alert(g()); // 2
</script>
把這段代碼扔到IE 6 里面和chorme里面是完全不同的兩種效果。
這里輸出2 是在ie6里面的效果,如果在chorme會出現(xiàn)g沒有定義。
這也算是JScript的bug吧。
在這里很明顯,這里的只是定義了g的函數(shù)表達(dá)式而已。包括在if的條件語句中,也只是定義了函數(shù)表達(dá)式,沒有去聲明函數(shù)。
那么這樣直接訪問肯定是會出錯的。
那么對于何為聲明,何為函數(shù)表達(dá)式呢?
在ECMAScript中,創(chuàng)建函數(shù)的最常用的兩個方法是函數(shù)表達(dá)式和函數(shù)聲明,兩者期間的區(qū)別是有點暈,因為ECMA規(guī)范只明確了一點:函數(shù)聲明必須帶有標(biāo)示符(Identifier)(就是大家常說的函數(shù)名稱),而函數(shù)表達(dá)式則可以省略這個標(biāo)示符:
函數(shù)聲明:
function 函數(shù)名稱 (參數(shù):可選){ 函數(shù)體 }
函數(shù)表達(dá)式:
function 函數(shù)名稱(可選)(參數(shù):可選){ 函數(shù)體 }
所以,可以看出,如果不聲明函數(shù)名稱,它肯定是表達(dá)式,可如果聲明了函數(shù)名稱的話,如何判斷是函數(shù)聲明還是函數(shù)表達(dá)式呢?ECMAScript是通過上下文來區(qū)分的,如果function foo(){}是作為賦值表達(dá)式的一部分的話,那它就是一個函數(shù)表達(dá)式,如果function foo(){}被包含在一個函數(shù)體內(nèi),或者位于程序的最頂部的話,那它就是一個函數(shù)聲明。
還有一種函數(shù)表達(dá)式不太常見,就是被括號括住的(function foo(){}),他是表達(dá)式的原因是因為括號 ()是一個分組操作符,它的內(nèi)部只能包含表達(dá)式。
你可能會想到,在使用eval對JSON進(jìn)行執(zhí)行的時候,JSON字符串通常被包含在一個圓括號里:eval('(' + json + ')'),這樣做的原因就是因為分組操作符,也就是這對括號,會讓解析器強(qiáng)制將JSON的花括號解析成表達(dá)式而不是代碼塊。
您可能感興趣的文章:
- JavaScript中函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別詳解
- 淺談javascript 函數(shù)表達(dá)式和函數(shù)聲明的區(qū)別
- JavaScript中函數(shù)表達(dá)式和函數(shù)聲明及函數(shù)聲明與函數(shù)表達(dá)式的不同
- 詳解JavaScript中的函數(shù)聲明和函數(shù)表達(dá)式
- js中函數(shù)聲明與函數(shù)表達(dá)式
- JavaScript中的函數(shù)聲明和函數(shù)表達(dá)式區(qū)別淺析
- 淺析javascript中函數(shù)聲明和函數(shù)表達(dá)式的區(qū)別
- javascript函數(shù)聲明和函數(shù)表達(dá)式區(qū)別分析
- Javascript學(xué)習(xí)筆記之 函數(shù)篇(一) : 函數(shù)聲明和函數(shù)表達(dá)式
- Javascript中的函數(shù)聲明與函數(shù)表達(dá)式(奇技淫巧)
- 理解 javascript 中的函數(shù)表達(dá)式與函數(shù)聲明
相關(guān)文章
微信小程序?qū)崿F(xiàn)兩邊小中間大的輪播效果的示例代碼
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)兩邊小中間大的輪播效果的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
JavaScript 中調(diào)用 Kotlin 方法實例詳解
這篇文章主要介紹了JavaScript 中調(diào)用 Kotlin 方法實例詳解的相關(guān)資料,需要的朋友可以參考下2017-06-06
javascript原型鏈學(xué)習(xí)記錄之繼承實現(xiàn)方式分析
這篇文章主要介紹了javascript原型鏈學(xué)習(xí)記錄之繼承實現(xiàn)方式,結(jié)合實例形式分析了javascript使用原型鏈實現(xiàn)繼承的相關(guān)操作技巧與注意事項,需要的朋友可以參考下2019-05-05
基于Bootstrap的Metronic框架實現(xiàn)頁面鏈接收藏夾功能
本文給大家介紹基于Metronic的Bootstrap開發(fā)框架實現(xiàn)頁面鏈接收藏夾功能,非常不錯,具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧2016-08-08
gameboy網(wǎng)頁闖關(guān)游戲(riddle webgame)--仿微信聊天的前端頁面設(shè)計和難點
本文講如何在網(wǎng)頁端實現(xiàn)一個仿微信的聊天窗口界面, 以及其中涉及到的一些技術(shù)點. 對gameboy闖關(guān)游戲相關(guān)知識感興趣的朋友參考下2016-02-02
layer ui 導(dǎo)入文件之前傳入數(shù)據(jù)的實例
今天小編就為大家分享一篇layer ui 導(dǎo)入文件之前傳入數(shù)據(jù)的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-09-09

