什么是變量提升?

變量提升(Hoisting) 是 JavaScript 引擎在代碼執行前的一個特殊行為,它會將變量聲明和函數聲明自動移動到當前作用域的頂部。但需要注意的是,只有聲明會被提升,賦值操作不會提升。


??核心概念??

  1. 變量聲明提升(僅 var 和函數參數):
    ? 用 var 聲明的變量會被提升到作用域頂部,但賦值留在原地。

    ? 用 letconst 聲明的變量也會被提升,但不會初始化,導致暫時性死區(TDZ)。

  2. 函數聲明提升:
    ? 函數聲明(非函數表達式)整體被提升,包括函數體。


??示例代碼??

  1. var 的變量提升
 

javascript

復制

console.log(a); // 輸出 undefined(變量聲明被提升,但未賦值)
var a = 10;

等價于:

 

javascript

復制

var a;          // 聲明提升到頂部
console.log(a); // undefined
a = 10;         // 賦值留在原地
  1. letconst 的暫時性死區
 

javascript

復制

console.log(b); // 報錯:Cannot access 'b' before initialization
let b = 20;

雖然 b 的聲明被提升,但在聲明前訪問會觸發錯誤。

  1. 函數聲明提升
 

javascript

復制

foo(); // 輸出 "Hello"
function foo() {console.log("Hello");
}

等價于:

 

javascript

復制

function foo() { // 函數聲明整體提升console.log("Hello");
}
foo();

??注意事項??

  1. 函數表達式不會被提升:

     

    javascript

    復制

    bar(); // 報錯:bar is not a function
    var bar = function() { /* ... */ };

    此時 bar 是變量,提升的是變量聲明(值為 undefined)。

  2. 函數聲明優先級高于變量聲明:

     

    javascript

    復制

    console.log(typeof a); // 輸出 "function"
    var a = 3;
    function a() {}

??為什么會有變量提升???
JavaScript 引擎在執行代碼前會經歷兩個階段:

  1. 編譯階段:解析代碼,提升變量和函數聲明。
  2. 執行階段:逐行執行代碼。

??如何避免問題???

  1. 優先使用 letconst:避免 var 的隱式全局變量和提升問題。
  2. 聲明變量時先寫后用:
     

    javascript

    復制

    let c = 30;
    console.log(c); // 正常輸出 30
  3. 使用嚴格模式("use strict"):禁止意外的全局變量。

??總結??
? 變量提升是 JavaScript 的歷史遺留特性,可能導致意外行為。

? var 會提升聲明但初始化為 undefinedlet/const 存在暫時性死區。

? 函數聲明整體提升,函數表達式不會被提升。

? 現代開發中推薦使用 let/const 和函數表達式(箭頭函數)來規避問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82178.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82178.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82178.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【萬字長文】深入淺出 LlamaIndex 和 LangChain:從RAG到智能體,輕松駕馭LLM應用開發

Langchain系列文章目錄 01-玩轉LangChain:從模型調用到Prompt模板與輸出解析的完整指南 02-玩轉 LangChain Memory 模塊:四種記憶類型詳解及應用場景全覆蓋 03-全面掌握 LangChain:從核心鏈條構建到動態任務分配的實戰指南 04-玩轉 LangChai…

2025 后端自學UNIAPP【項目實戰:旅游項目】3、API接口請求封裝,封裝后的簡單測試以及實際使用

一、創建請求封裝目錄 選中自己的項目,右鍵鼠標---->新建---->目錄---->名字自定義【我的是api】 二、創建兩個js封裝文件 選中封裝的目錄,右鍵鼠標---->新建---->js文件---->名字自定義【我的兩個js文件分別是my_http和my_api】 三…

autojs和冰狐智能輔助該怎么選擇?

最近打算做自動化腳本,在autojs和冰狐智能輔助中做選擇,不知道該怎么選。沒辦法只能花費大量時間仔細研究了autojs和冰狐智能輔助,綜合考慮功能需求、開發復雜度、編程經驗及項目規模等因素。以下是兩者的核心對比及選擇建議,僅供…

python24-匿名函數

課程:B站大學 記錄python學習,直到學會基本的爬蟲,使用python搭建接口自動化測試就算學會了,在進階webui自動化,app自動化 匿名函數 匿名函數實踐是檢驗真理的唯一標準 匿名函數 匿名函數是指沒有名字的函數&#xff…

Android 查看 Logcat (可純手機方式 無需電腦)

安裝 Logcat Reader Github Google Play 如果有電腦 使用其ADB方式可執行如下命令 后續無需安裝Termux # 使用 ADB 授予 android.permission.READ_LOGS 權限給 Logcat Reader adb shell "pm grant com.dp.logcatapp android.permission.READ_LOGS && am force-…

驅動開發硬核特訓 · Day 30(上篇):深入理解 I2C 總線驅動模型(以 at24 EEPROM 為例)

作者:嵌入式Jerry 視頻教程請關注 B 站:“嵌入式Jerry” 一、寫在前面 在上一階段我們已經深入理解了字符設備驅動與設備模型之間的結合方式、sysfs 的創建方式以及平臺驅動模型的實際運用。今天我們邁入總線驅動模型的世界,聚焦于 I2C 總線…

超詳細講解注意力機制、自注意力機制、多頭注意力機制、通道注意力機制、空間注意力機制

在如今的機器學習和深度學習領域,注意力機制絕對是一個熱度居高不下的話題。事實上,注意力機制并不是一個全新的概念,早在多年前就已經被提出并應用。比如在圖像分類任務中,SENet 和 ECA-Net 等模型中都運用了注意力機制&#xff…

Wireshark基本使用

本文會對Wireshark做簡單介紹,帶大家熟悉一下Wireshark的界面,以及如何使用過濾器。 接著會帶大家查看TCP五層模型下,帶大家回顧各層首部的格式。 最后會演示 Wireshark 如何抓取三次握手和四次揮手包的過程。 目錄 一.Wireshark簡介 二…

加速項目落地(Trae編輯器)

目錄 vscode安裝python支持 vscode常用插件 Trae編輯器 兩個界面合成 補充(QT開發的繁瑣) AI編程哪家強?Cursor、Trae深度對比,超詳細! - 知乎 Trae兼容vscode的插件,我們可以先在vscode里面裝好再一…

stable diffusion的attention-map:提取和可視化跨注意力圖

項目: wooyeolbaek/attention-map-diffusers: 🚀 Cross attention map tools for huggingface/diffusers 參考:【可視化必備技能(1)】SD / Flux 文生圖模型的 Attention Map 可視化-CSDN博客

多環串級PID

文章目錄 為什么要多環程序主函數內環外環 雙環PID調參內環Kp調法Ki調法 外環Kp 以一定速度到達指定位置封裝 為什么要多環 單環只能單一控制速度或者位置,如果想要同時控制多個量如速度,位置,角度,就需要多個PID 速度環一般PI…

基于Kubernetes的Apache Pulsar云原生架構解析與集群部署指南(上)

#作者:閆乾苓 文章目錄 概念和架構概述主要特點消息傳遞核心概念Pulsar 的消息模型Pulsar 的消息存儲與分發Pulsar 的高級特性架構BrokerBookKeeperZooKeeper 概念和架構 概述 Pulsar 是一個多租戶、高性能的服務器到服務器消息傳遞解決方案。Pulsar 最初由雅虎開…

電子電氣架構 --- 如何有助于提安全性并減少事故

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

rest_framework學習之認證 權限

權限 DRF提供如下幾種常見權限: IsAuthenticated, 認證通過 IsAdminUser, 管理員權限 IsAuthenticatedOrReadOnly, 登錄用戶增刪改 非登錄用戶只能查詢 AllowAny,無需認證(默認) 在rest_framework的APIView基礎類中&#xf…

【使用switch結構輸出季節】2021-11-23

緣由用switch語句設計程序一年有12個月-編程語言-CSDN問答 void 使用switch結構輸出季節(int y) {//緣由https://ask.csdn.net/questions/7577096?spm1005.2025.3001.5141std::cout << y << "\t";switch (y){case 3: case 4: case 5:std::cout <<…

主備Smart Link + Monitor Link組網技術詳細配置

1.實驗拓撲 2.使用設備 eNSP模擬建議下行設備三臺使用S3700模擬&#xff08;全部使用S5700可能會出現流量丟失等異常問題。&#xff09; 3.實驗配置 [SW1]dis cu # sysname SW1 # vlan batch 100 110 # interface Ethernet0/0/1port link-type accessport default vlan 100 …

【hadoop】案例:Sqoop遷移倉庫數據

1 數據導出&#xff1a;Hive導入MySQL [hadoophadoop1 sqoop]$ bin/sqoop export \ > --connect jdbc:mysql://localhost/weather \ > --username root \ > --password 123456 \ > --table mean_temperature \ > --export-dir /user/hive/warehouse/mydb/mean…

Mysql-OCP PPT課程講解并翻譯

#跳過介紹&#xff0c;直接從干貨開始記錄 第一章 安裝mysql

springboot+vue實現在線網盤(云盤)系統

今天教大家如何設計一個網盤&#xff08;云盤&#xff09;系統系統 , 基于目前主流的技術&#xff1a;前端vue&#xff0c;后端springboot。 同時還帶來的項目的部署教程。 視頻演示 springbootvue實現在線網盤&#xff08;云盤&#xff09;系統 圖片演示 一. 系統概述 用過百…

JAVA:Spring Boot 集成 Lua 的技術博客

1、簡述 在現代開發中,Lua 以其輕量級、高性能以及易嵌入的特點廣泛用于腳本擴展、游戲開發以及配置處理場景。將 Lua 與 Spring Boot 集成,可以在 Java 項目中實現動態腳本功能,增強項目的靈活性和動態配置能力。 樣例代碼: https://gitee.com/lhdxhl/springboot-example…