JavaScript中標識符提升問題_javascript技巧
JS 存在變數提升,這個的設計其實是低劣的,或是語言實作時的副作用。它允許變數不聲明就可以訪問,或聲明在後使用在前。新手對此則很迷惑,甚至許多使用JS多年老手也比較迷惑。但在 ES6 加入 let/const 後,變數Hoisting 就不存在了。
一、 變數未聲明,直接使用
function test() { alert(notDefined); } test(); // ?
報錯是自然的
二. 變數宣告在結尾
function test() { alert(declaredButNotAssigned); // undefined var declaredButNotAssigned; } test();
輸出 undefined, 結果比上例有所改善,沒有報錯,程式碼可以運行,但變數值可能不是程式設計師所期望的。
三、 變數宣告在末尾,同時賦值變數
function test() { alert(declaredAndAssigned); // undefined var declaredAndAssigned = 1; } test();
結果和 二 相同, 很明顯,不會因為賦值了就輸出 1。
二、三 都發生了變數提升(Hoisting),簡單定義
變數提升: 在指定作用域裡,從程式碼順序上看是變數先使用後聲明,但運行時變數的「可訪問性」 提升到目前作用域的頂部,其值為undefined ,沒有「可用性」。
這裡強調 “程式碼順序” 和 “運行順序”,是因為多數時候我們寫的程式碼都是順序執行的,即 “程式碼順序” 和 “運行順序” 是一致的。這也符合人的大腦的思考過程。例如有過 C語言 經驗的程式設計師
#include <stdio.h> int main() { int x = 1; printf("%d, ", x); // 1 }
兩句程式碼,先宣告整數型 x, 再輸出。程式碼順序和運行順序是一致的,即正常運行。
如果順序反過來
#include <stdio.h> int main() { printf("%d, ", x); // error int x = 1; }
此時,編譯都不能通過了。但JS裡可以反過來寫,見二、三。
因此,有類 C語言 經驗的程式設計師,都很清楚變數需要 先聲明後使用,不然會報錯。而到了JS裡,有 變數提升 現象,可以 先使用後聲明,C 的經驗用到 JS 裡迷惑便出現了。
四、 函數表達式也存在變數提升
function test() { alert(func); // undefined var func = function() {}; } test();
但如果想使用這個 func,則無可能
function test() { alert(func); // undefined func(); // 报异常 var func = function() {}; } test();
結果func 是 undefined,呼叫 func 則會報異常。 在上面的定義中提到了 可訪問性 和 可用性 對應如下語句。
可訪問性:alert(func),輸出 undefined,可以運行,可以存取 func。
可用性: func(), 封包異常,無法正常呼叫 func,表示無可用性。
二、三、四 都是使用 var 宣告的變量,JS 裡函數宣告也會存在提升,只是這個 「變數」 比較特殊,它是一個 function 類型(可以作為函數、方法或建構器)。它的名字(標識符)也會提升到目前作用域的頂端。
五、函數宣告的名稱也會提升到目前作用域頂端
function test() { alert(f1); // function f1(); // "called" function f1() { alert('called'); } } test();
我們看到,聲明 f1 在程式碼最末,f1 使用在前,alert(f1) 和 f1() 都正常執行,表示 可訪問性 和 可用性 都有了。
前面說了,變數提升(Hoisting)沒什麼用,屬於語言的低劣設計,好的習慣還是 「先聲明後使用」。這個特質也會出現在不少大公司面試題目裡
題1:
// 写出以下代码的运行结果 var a = 1; function fn() { if (!a) { var a = 2; } alert(a); // ? } fn();
題2:
// 写出以下代码的运行结果 var a = 1; function fn() { a = 2; return; function a() {} } fn(); alert(a); // ?
但這一切隨著 ES6 的 let/const 到來結束了,ES裡除全域變數外,其它都使用 let/const,var 替換成 let 後變數提升就不復存在了。
function test() { alert(declaredButNotAssigned1); // 报异常 alert(declaredButNotAssigned2); // 报异常 alert(func); // 报异常 let declaredButNotAssigned1; let declaredButNotAssigned2 = true; let func = function() {}; } test();
這強製程式設計師養成好的習慣,變數需要“先聲明再使用”,否則報錯。
以下摘自MDN的關於let不在發生變數提升的描述
In ECMAScript 6, let does not hoist the variable to the top of the block. If you reference a variable in a block before the let declaration for that variable is encountered, this results in a ReferenceError, incause the vor. zone" from the start of the block until the declaration is processed.
用 let 宣告變數後,typeof 也不再安全
if (condition) { alert(typeof num); // Error! let num = 100; }
以前可以用 typeof == 'undefined',來判斷是否引入了某lib,例如jQuery
// 判断jQuery是否引入了 if (typeof $ !== 'undefined') { // do something }...
jQuery沒有引入,$ 沒有聲明,這句話也不會報錯而影響到下面的程式碼執行,但如果是 let 宣告的就會報錯了。
以上所述就是本文的全部內容了,希望大家能夠喜歡。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數
