首頁 web前端 js教程 js中變數宣告以及函數宣告提升的詳細解析(附範例)

js中變數宣告以及函數宣告提升的詳細解析(附範例)

Aug 23, 2018 pm 02:16 PM
函數聲明 變數聲明

這篇文章帶給大家的內容是關於js中變數宣告以及函數宣告提升的詳細解析(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

變數宣告提升
1、變數定義
可以使用var定義變量,變數如果沒有賦值,那麼變數的初始值為undefined。

2、變數作用域
變數作用域指變數起作用的範圍。變數分為全域變數和局部變數。全域變數在全域都擁有定義;而局部變數只能在函數內有效。 
在函數體內,同名的局部變數或參數的優先權會高於全域變數。也就是說,如果函數內存在和全域變數同名的局部變數或參數,那麼全域變數將會被局部變數覆蓋。
所有不使用var定義的變數都視為全域變數

3、函數作用域和宣告提前
JavaScript的函數作用是指在函數內宣告的所有變數在函數體內總是有定義的,也就是說變數在宣告之前已經可用,所有這特性稱為宣告提前(hoisting),即JavaScript函數裡的所有宣告(只是聲明,但不涉及賦值)都被提前到函數體的頂部,而變數賦值操作留在原來的位置。如下列範例:  
註解:宣告事先是在JavaScript引擎的預編譯時進行,是在程式碼開始運作之前。

var scope = 'global';function f(){
    console.log(scope);    
    var scope = 'local';
    console.log(scope);
}
登入後複製

由於函數內宣告提升,所以上面的程式碼其實是這樣的

var scope = 'global';function f(){
    var scope;    //变量声明提升到函数顶部
    console.log(scope);
    scope = 'local';    //变量初始化依然保留在原来的位置
    console.log(scope);
}
登入後複製

經過這樣變形之後,答案就非常明顯了。由於scope在第一個console.log(scope)語句之前就已經定義了,但是並沒有賦值,因此此時scope的指是undefined.第二個console.log(scope)語句之前,scope已經完成賦值為'local',所以輸出的結果是local。

函數宣告提升
函數宣告語法

f('superman');function f(name){
    console.log(name);
}
登入後複製

函數表達式語法

f('superman');var f= function(name){
    console.log(name);
}
登入後複製

執行上面的程式碼,會報錯Uncaught ReferenceError: f is not defined(…),錯誤訊息顯示說f沒有被定義。 
為什麼同樣的程式碼,函數宣告和函數表達式有差異呢? 
這是因為,函數宣告有一個非常重要的特徵:函數宣告提升,函數宣告語句將會被提升到外在腳本或是外在函數作用域的頂端(是不是跟變數提升非常類似)。正是因為這個特徵,所以可以把函數宣告放在呼叫它的語句後面。如下面例子,最終的輸出結果應該是什麼? :

var getName = function(){
    console.log(2);
}function getName (){
    console.log(1);
}
getName();
登入後複製

可能會有人覺得最後輸出的結果是1。讓我們來分析一下,這個例子涉及了變數宣告提升和函數宣告提升。如同前面說到的函數宣告提升,函數宣告function getName(){}的宣告會被提前到頂端。而函數表達式var getName = function(){}則表現出變數宣告提升。因此在這種情況下,getName也是一個變量,因此這個變數的宣告也會提升到底部,而變數的賦值仍然保留在原來的位置。要注意的是,函數優先,雖然函數宣告和變數宣告都會被提升,但是函數會先被提升,然後才是變數。因此上面的函數可以轉換成下面的樣子:

function getName(){    //函数声明提升到顶部
    console.log(1);
}
var getName;    //变量声明提升
getName = function(){    //变量赋值依然保留在原来的位置
    console.log(2);
}
getName();    // 最终输出:2
登入後複製

所以最終的輸出結果是:2。在原來的例子中,函數宣告雖然是在函數表達式後面,但由於函數宣告提升到頂部,因此後面getName又被函數表達式的賦值運算給覆寫了,所以輸出2。

相關推薦:



#

以上是js中變數宣告以及函數宣告提升的詳細解析(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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)

C++ 函數宣告中的預設參數:全面解析其宣告和用法 C++ 函數宣告中的預設參數:全面解析其宣告和用法 May 02, 2024 pm 03:09 PM

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

解決C++程式碼中出現的「error: use of undeclared identifier 'variable'」問題 解決C++程式碼中出現的「error: use of undeclared identifier 'variable'」問題 Aug 26, 2023 pm 01:46 PM

解決C++程式碼中出現的「error:useofundeclaredidentifier'variable'」問題在使用C++進行程式設計時,我們常常會遇到各種各樣的錯誤。其中一個常見的錯誤是「error:useofundeclaredidentifier'variable'」。這個錯誤通常意味著我們在程式碼中使用了一個未宣告的變數。這篇文章將詳

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

如何在PHP中使用變數 如何在PHP中使用變數 May 20, 2023 pm 02:33 PM

PHP是一種非常流行的網頁開發語言,它允許開發人員在伺服器端創建動態Web應用程式。在PHP中,變數是一種基本的資料結構,用於儲存值和資料。本文將介紹如何在PHP中使用變數。變數的基本語法在PHP中宣告變數的語法非常簡單。變數名以美元符號($)開頭,後面跟著變數名。變數名稱可以是字母、數字或底線的組合,但必須以字母或底線開頭。例如,下面的程式碼聲明了一個名

See all articles