首頁 web前端 js教程 javascript 函數宣告與函數表達式的差異介紹_javascript技巧

javascript 函數宣告與函數表達式的差異介紹_javascript技巧

May 16, 2016 pm 05:20 PM
函數聲明

還是一樣,先上程式碼:

複製程式碼 程式碼如下:

<script> >var f = function g() { <BR>return 1; <BR>}; <BR>if (false) { <BR>f = function g(){ <BR>return 2; <BR>}; <BR>} <BR>alert(g()); // 2 <BR></script>

把這段程式碼丟到IE 6 裡面和chorme裡面是完全不同的兩種效果。

這裡輸出2 是在ie6裡面的效果,如果在chorme會出現g沒有定義。

這也算是JScript的bug吧。

在這裡很明顯,這裡的只是定義了g的函數表達式而已。包括在if的條件語句中,也只是定義了函數表達式,沒有去宣告函數。

那麼這樣直接存取肯定是會出錯的。

那麼對於何為聲明,何為函數表達式呢?

在ECMAScript中,創建函數的最常用的兩個方法是函數表達式和函數聲明,兩者期間的區別是有點暈,因為ECMA規範只明確了一點:函數聲明必須帶有標示符(Identifier)(就是大家常說的函數名稱),而函數表達式可以省略這個標示符:
函數宣告:
  function 函數名稱(參數:可選){ 函數體}
函數表達式:
  function 函數名稱(可選)(參數:可選){ 函數體}

所以,可以看出,如果不聲明函數名稱,它肯定是表達式,可如果宣告了函數名稱的話,如何判斷是函數宣告還是函數表達式呢? ECMAScript是透過上下文來區分的,如果function foo(){}是作為賦值表達式的一部分的話,那它就是一個函數表達式,如果function foo(){}被包含在一個函數體內,或者位於程式的最頂端的話,那它就是一個函數宣告。

還有一個函數表達式不太常見,就是被括號括住的(function foo(){}),他是表達式的原因是因為括號()是一個分組運算符,它的內部只能包含表達式。

你可能會想到,在使用eval對JSON進行執行的時候,JSON字串通常被包含在一個圓括號裡:eval('(' json ')'),這樣做的原因就是因為分組運算符,也就是這對括號,會讓解析器強迫將JSON的花括號解析成表達式而不是程式碼區塊。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
C++ 函數宣告中的預設參數:全面解析其宣告和用法 C++ 函數宣告中的預設參數:全面解析其宣告和用法 May 02, 2024 pm 03:09 PM

C++中的預設參數提供函數參數指定預設值的功能,從而增強程式碼可讀性、簡潔性和靈活性。宣告預設參數:在函數宣告中將參數後面加上"="符號,後面接著預設值。用法:函數呼叫時,若未提供可選參數,則會使用預設值。實戰案例:計算兩個數之和的函數,一個參數必填,另一個可填且有預設值0。優點:增強可讀性、增加彈性、減少樣板程式碼。注意事項:只能在聲明中指定,必須位於末尾,類型必須相容。

C++ 函數的宣告和定義的順序有什麼影響? C++ 函數的宣告和定義的順序有什麼影響? Apr 19, 2024 pm 01:42 PM

在C++中,函數宣告和定義的順序會影響編譯和連結過程。最常見的是聲明在前,定義在後;也可使用「forwarddeclaration」將定義放在聲明前;如果兩者同時存在,編譯器將忽略聲明,僅使用定義。

C++ 函式宣告和定義有什麼差別? C++ 函式宣告和定義有什麼差別? Apr 18, 2024 pm 04:03 PM

函數聲明告知編譯器函數的存在,不包含實現,用於型別檢查。函數定義提供實際實現,包含函數體。區分的關鍵特徵包括:目的、位置、作用。理解差異對於編寫有效且可維護的C++程式碼至關重要。

C++ 函式的宣告與定義 C++ 函式的宣告與定義 Apr 11, 2024 pm 01:27 PM

函數宣告和定義在C++中是必要的,函數宣告指定函數的傳回類型、名稱和參數,而函數定義包含函數體和實作。首先聲明函數,然後在程式中使用它並傳遞所需的參數。使用return語句從函數傳回一個值。

C++編譯錯誤:函式呼叫與函式宣告不符,該怎麼解決? C++編譯錯誤:函式呼叫與函式宣告不符,該怎麼解決? Aug 22, 2023 pm 12:39 PM

C++編譯錯誤:函式呼叫與函式宣告不符,該怎麼解決?在開發C++程式時,難免會遇到一些編譯錯誤,其中一個常見的錯誤是函式呼叫與函式宣告不符的錯誤。這種錯誤廣泛存在於C++程式設計師中,由於不注意函數宣告的正確性,導致編譯問題,最終浪費時間和精力修復問題,影響開發效率。避免這種錯誤的方法需要遵循一些規範和標準實踐,以下讓我們來了解一下。什麼是函數呼叫與函數宣告不

C++ 函數宣告中的[[nodiscard]]:揭開忽略返回值後果的神秘面紗 C++ 函數宣告中的[[nodiscard]]:揭開忽略返回值後果的神秘面紗 May 01, 2024 pm 06:18 PM

[[nodiscard]]屬性指示函數的回傳值不得忽略,否則將導致編譯器警告或錯誤,以防止以下後果:未初始化異常、記憶體洩漏和錯誤的計算結果。

C++ 函式宣告的詳細語法:從語法解析到規範用法解析 C++ 函式宣告的詳細語法:從語法解析到規範用法解析 Apr 30, 2024 pm 02:54 PM

C++函式宣告語法為:returnTypefunctionName(parameterType1parameterName1,...,parameterTypeNparameterNameN);,其中returnType為傳回型別,functionName為函式名,parameterType為參數類型,parameterName為參數名,必須以分號結尾。

C++ 函數宣告的逐步指南:涵蓋每個步驟的詳細說明 C++ 函數宣告的逐步指南:涵蓋每個步驟的詳細說明 May 02, 2024 pm 04:33 PM

函數聲明告訴編譯器函數的存在,無需提供函數體。步驟如下:指定函數傳回類型(void如果無返回值)定義函數名稱聲明函數參數(可選,包括資料類型和識別碼)加分號

See all articles