JavaScript作用域和作用域鏈

在JavaScript中,作用域和作用域鏈是理解代碼執行和變量訪問的關鍵概念。它們決定了變量和函數在代碼中的可見性和生命周期。

一、作用域(Scope)

(一)什么是作用域?

作用域是在運行時代碼中的某些特定部分中變量、函數和對象的可訪問性。換句話說,作用域決定了代碼區塊中變量和其他資源的可見性。

作用域的主要作用是隔離變量,防止不同作用域下的同名變量發生沖突。例如:

function outFun2() {var inVariable = "內層變量2";
}
outFun2();
console.log(inVariable); // Uncaught ReferenceError: inVariable is not defined

在上面的例子中,變量inVariable在全局作用域中沒有聲明,因此在全局作用域下訪問它會報錯。

(二)全局作用域和函數作用域

1. 全局作用域

全局作用域是指在代碼中任何地方都能訪問到的對象。以下幾種情形擁有全局作用域:

  • 最外層函數和在最外層函數外面定義的變量擁有全局作用域。
  • 所有未定義直接賦值的變量自動聲明為擁有全局作用域。
  • 所有window對象的屬性擁有全局作用域。
var outVariable = "我是最外層變量"; // 最外層變量
function outFun() { // 最外層函數var inVariable = "內層變量";function innerFun() { // 內層函數console.log(inVariable);}innerFun();
}
console.log(outVariable); // 我是最外層變量
outFun(); // 內層變量
console.log(inVariable); // inVariable is not defined

全局作用域的弊端是容易污染全局命名空間,引起命名沖突。因此,通常建議將代碼封裝在函數中,避免全局變量的濫用。

2. 函數作用域

函數作用域是指聲明在函數內部的變量,這些變量只能在函數內部訪問。例如:

function doSomething() {var stuName = "zhangsan";function innerSay() {console.log(stuName);}innerSay();
}
console.log(stuName); // 腳本錯誤
innerSay(); // 腳本錯誤

函數作用域的一個重要特點是內層作用域可以訪問外層作用域的變量,但外層作用域不能訪問內層作用域的變量。

(三)塊級作用域

ES6引入了塊級作用域,通過letconst關鍵字聲明的變量具有塊級作用域。塊級作用域在以下情況被創建:

  1. 在一個函數內部。
  2. 在一個代碼塊(由一對花括號包裹)內部。

塊級作用域的特點包括:

  • 聲明變量不會提升到代碼塊頂部。
  • 禁止重復聲明。
  • 循環中的綁定塊作用域的妙用。
for (let i = 0; i < 10; i++) {console.log(i); // i 在循環內部有效
}
console.log(i); // ReferenceError: i is not defined

二、作用域鏈

(一)什么是自由變量?

自由變量是指在當前作用域中沒有定義的變量。例如:

var a = 100;
function fn() {var b = 200;console.log(a); // 這里的 a 是一個自由變量console.log(b);
}
fn();

fn函數中,a是一個自由變量,因為它在fn函數的作用域中沒有定義。

(二)什么是作用域鏈?

作用域鏈是指當訪問一個變量時,編譯器會從當前作用域開始,逐層向上查找,直到找到該變量或到達全局作用域。例如:

var a = 100;
function f1() {var b = 200;function f2() {var c = 300;console.log(a); // 100console.log(b); // 200console.log(c); // 300}f2();
}
f1();

f2函數中,ab是自由變量,它們的值通過作用域鏈從外層作用域中獲取。

(三)關于自由變量的取值

自由變量的值是在函數定義時確定的,而不是在函數調用時確定的。例如:

var x = 10;
function fn() {console.log(x);
}
function show(f) {var x = 20;(function () {f(); // 輸出 10,而不是 20})();
}
show(fn);

fn函數中,x的值是在fn函數定義時確定的,因此輸出的是全局作用域中的x,而不是show函數中的x

三、作用域與執行上下文

許多開發人員經常混淆作用域和執行上下文的概念。雖然它們都與變量的訪問和函數的執行有關,但它們是不同的概念。

  • 作用域:作用域是在函數定義時確定的,它決定了變量的可見性和生命周期。
  • 執行上下文:執行上下文是在函數執行時創建的,它包括變量對象、作用域鏈和this的指向。

(一)執行上下文的生命周期

執行上下文的生命周期分為兩個階段:

  1. 創建階段:當代碼執行進入一個環境時,會創建一個執行上下文。在這個階段,執行上下文會進行以下操作:

    • 創建變量對象(Variable Object,VO):包括函數的形參、arguments對象、函數聲明和變量聲明。
    • 確定this的指向。
    • 確定作用域鏈。
  2. 執行階段:在執行階段,代碼開始執行,變量被賦值,函數被調用,其他代碼按順序執行。

四、總結

理解作用域和作用域鏈的工作原理和實際應用,可以幫助你更好地理解代碼的執行流程和變量的訪問機制。如果你對本文的內容有任何疑問或補充,歡迎在評論區留言討論。

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

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

相關文章

人工智能的“歧視”:“她數據”在算法運行中隱形

縱觀人類的發展史&#xff0c;每一次科技進步都將對性別平等產生深刻影響。尤其是當下&#xff0c;人們對于借助人工智能技術快速發展來彌合性別不平等寄予厚望。 但很多人沒想過&#xff0c;人工智能技術本身是客觀中立、不存在“算法歧視”“性別偏見的嗎&#xff1f; 弗吉…

設備全生命周期管理:從采購到報廢的數字化閉環方案

在當今數字化時代&#xff0c;企業對設備的管理已不再局限于簡單的維護與修理&#xff0c;而是追求從采購到報廢的全生命周期數字化閉環管理。易點易動設備管理系統&#xff0c;正是這一趨勢下的佼佼者&#xff0c;它為企業提供了一套高效便捷的設備管理解決方案。 采購階段&a…

React中useState中更新是同步的還是異步的?

文章目錄 前言一、useState 的基本用法二、useState 的更新機制1. 內部狀態管理2. 狀態初始化3. 狀態更新 三、useState 的更新頻率與異步行為1. 異步更新與批量更新2. 為什么需要異步更新&#xff1f; 四、如何正確處理 useState 的更新1. 使用回調函數形式的更新2. 理解異步更…

FEKO許可證與其他電磁仿真軟件的比較

在電磁仿真領域&#xff0c;眾多軟件工具競相爭艷&#xff0c;而FEKO軟件及其許可證制度在其中獨樹一幟。本文將對比FEKO許可證與其他電磁仿真軟件&#xff0c;突出FEKO在許可證方面的卓越性能與獨特優勢&#xff0c;幫助您做出明智的選擇。 一、許可證成本與價值比較 相較于其…

綠色云計算:數字化轉型與可持續發展的完美融合

目錄 引言 綠色云計算的概念與定義 云計算的環境影響與綠色云計算的重要性 綠色云計算的技術實踐與策略 綠色云計算的案例研究與最佳實踐 綠色云計算的挑戰與限制 綠色云計算的未來趨勢與預測 結論與展望 引言 隨著云計算技術的迅猛發展和廣泛應用&#xff0c;其環境影…

在innovus中如何設置讓信號線打上雙孔

知識星球【芯冰樂】入口 為了讓設計的芯片良率能得到顯著提升,一般在繞線資源允許的情況下,我們會在盡可能多的signal線上打上雙孔,然而在進行某個項目的時候,小編驚訝的發現,在數字的layout上一個雙孔都沒出現,這是為什么呢?今天就讓小編分享一下這次新奇的發現; 經…

DevExpress GridControl 復選列實時獲取選中狀態的解決方案

問題核心分析 用戶在使用 DevExpress GridControl 的復選列時遇到兩個關鍵問題&#xff1a; 1.使用 CellValueChanged 事件需要點擊其他列才會觸發&#xff0c;無法實時響應勾選動作 2.使用 CheckedChanged 事件并調用 PostEditor() 會導致復選框無法選中 這主要是因為 DevExp…

數據一致性校驗算法

數據完整性校驗 在 數據錄入、通信協議&#xff08;CAN、LIN、Ethernet&#xff09; 和 存儲&#xff08;Flash、EEPROM&#xff09; 領域&#xff0c;數據校驗&#xff08;Error Checking&#xff09; 是確保 數據完整性和正確性的關鍵技術 示例&#xff1a;當我們從互聯網上…

101個α因子#9

((0 < ts_min(delta(close, 1), 5)) ? delta(close, 1) : ((ts_max(delta(close, 1), 5) < 0) ? delta(close, 1) : (-1 * delta(close, 1))))worldquant brain平臺上調整后的語法&#xff1a; ((0 < min(close-ts_delay(close, 1), ts_delay(close, 1)-ts_delay(c…

國產視頻轉換LT6211UX:HDMI2.0轉LVDS/MIPI芯片簡介,支持4K60Hz

1. LT6211UX HDMI2.0信號輸入 支持HDMI2.0b, HDMI1.4和DVI1.0 支持HDCP2.2和HDCP1.4 數據速率高達6Gbps 自適應接收機均衡 支持4k60Hz 支持的3D格式&#xff1a; 對于HDMI -> LVDS&#xff1a; 直接3D輸出 2路2D L/R輸出 對于HDMI -> MIPI&#xff1a; 框架包裝&#x…

華三(H3C)IRF堆疊心跳的LACP MAD、BFD MAD和ARP MAD差異

華三&#xff08;H3C&#xff09;IRF堆疊心跳的三種MAD&#xff08;多主檢測&#xff09;機制——LACP MAD、BFD MAD和ARP MAD在實現原理、組網要求及適用場景上存在顯著差異。以下是三者的對比分析&#xff1a; 一、核心區別對比 特性LACP MADBFD MADARP MAD檢測原理擴展LAC…

宿州金博學校開展防震演練:夯實安全根基,守護校園平安

5月13日上午9點30分&#xff0c;金博學校原本寧靜的校園被一陣急促的警報聲打破&#xff0c;一場精心籌備、緊張有序的防震演練正式開啟。本次演練意義重大&#xff0c;旨在強化全體師生的防震減災意識&#xff0c;提高大家在地震突發時的應急反應與自我保護能力。 緊急避險&am…

DAY29 超大力王愛學Python

知識點回顧 類的裝飾器裝飾器思想的進一步理解&#xff1a;外部修改、動態類方法的定義&#xff1a;內部定義和外部定義 作業&#xff1a;復習類和函數的知識點&#xff0c;寫下自己過去29天的學習心得&#xff0c;如對函數和類的理解&#xff0c;對python這門工具的理解等&…

RabbitMQ ④-持久化 || 死信隊列 || 延遲隊列 || 事務

消息確認機制 簡單介紹 RabbitMQ Broker 發送消息給消費者后&#xff0c;消費者處理該消息時可能會發生異常&#xff0c;導致消費失敗。 如果 Broker 在發送消息后就直接刪了&#xff0c;就會導致消息的丟失。 為了保證消息可靠到達消費者并且成功處理了該消息&#xff0c;…

python打卡訓練營打卡記錄day31

知識點回顧 規范的文件命名規范的文件夾管理機器學習項目的拆分編碼格式和類型注解 作業&#xff1a;嘗試針對之前的心臟病項目ipynb&#xff0c;將他按照今天的示例項目整理成規范的形式&#xff0c;思考下哪些部分可以未來復用。 心臟病項目目錄 目錄結構:heart/ ├── conf…

mac .zshrc:1: command not found: 0 解決方案

nano ~/.zshrc 使用自帶的nano命令打開文件&#xff0c;修改后 Ctrl X 然后輸入y 然后回車即可保存成功 一般情況下&#xff0c;不是常用這個命令&#xff0c;除非是遇到有問題的文件&#xff0c;才用&#xff0c; 例如 遇到下面的問題 /Users/xxli/.zshrc:1: command no…

uniapp生成的app,關于跟其他設備通信的支持和限制

以下內容通過AI生成&#xff0c;這里做一下記錄。 藍牙 移動應用&#xff08;App&#xff09;通過藍牙與其他設備通信&#xff0c;是通過分層協作實現的。 一、通信架構分層 應用層&#xff08;App&#xff09; 調用操作系統提供的藍牙API&#xff08;如Android的BluetoothA…

第50天-使用Python+Qt+DeepSeek開發AI運勢測算

1. 環境準備 bash 復制 下載 pip install pyside6 requests python-dotenv 2. 獲取DeepSeek API密鑰 訪問DeepSeek官網注冊賬號 進入控制臺創建API密鑰 在項目根目錄創建.env文件: env 復制 下載 DEEPSEEK_API_KEY=your_api_key_here 3. 創建主應用框架 python 復制…

上位機與Hid設備通信

前置知識 什么是HID&#xff1f; HID&#xff08;Human Interface Device&#xff09;是?直接與人交互的電子設備?&#xff0c;通過標準化協議實現用戶與計算機或其他設備的通信&#xff0c;典型代表包括鍵盤、鼠標、游戲手柄等。? 為什么HID要與qt進行通信&#xff1f; …

JVM 工具實戰指南(jmap / jstack / Arthas / MAT)

&#x1f50d; 從診斷到定位&#xff1a;掌握生產級 JVM 排查工具鏈 &#x1f4d6; 前言&#xff1a;系統故障時&#xff0c;如何快速定位&#xff1f; 無論 JVM 理論多么扎實&#xff0c;當線上服務出現 CPU 飆高、響應超時、內存泄漏或頻繁 Full GC 時&#xff0c;僅靠猜測…