搜尋
首頁web前端js教程Javascript中的作用域和上下文深入理解_javascript技巧

概述

Javascript中的作用域和上下文的實作是Javascript語言獨有的特性,從某種程度上來說,Javascript語言是十分靈活的。 Javascript中的函數可以採用各種各樣的上下文,作用域也可以被封裝和保存。正是由於這些特性,Javascript也提供了許多很有用的設計模式。然而,作用域和脈絡也是Javascript程式設計師在開發中經常迷惑的地方。
以下會向大家介紹Javascript中作用域和上下文的概念,以及它們的不同。

作用域 VS 上下文

首先要說明的很重要的一點是作用域和上下文並不是同一個概念,它們指涉的並不是同一個東西。作為一個前端的菜逼,常常會看到一些文章把這兩個概念弄混,結果有些東西越看越不明白。這兩個概念貌似被混淆了很長一段時間了。因此,查了很多資料,簡單說明下這兩個概念。 :stuck_out_tongue_closed_eyes:
在Javascript中,當函數被呼叫時都會有一個作用域和上下文和這個函數綁定在一起。從根本上來說,作用域是基於函​​數的而上下文是基於物件的。換句話說,作用域適用於函數被呼叫時函數中變數的存取權限。上下文通常是指「this」關鍵字的值,「this」是擁有目前執行程式碼的物件的參考。

變數作用域

變數可以定義在局域或全域作用域中,分別稱為局部變數和全域變數。全域變數是指在函數體外宣告的變量,在程式的任何地方都可以存取全域變數。局部變數是指在函數體內定義的變量,它僅可以在函數體內或嵌套的函數內被訪問,並且不能在函數外部被訪問。
Javascript目前並不支援區塊級作用域(在if、switch、for等語句中定義的變數)。這意味著在區塊內定義的變量,在區塊外也可以存取。但是,在ES6中,我們可以使用「let」關鍵字來定義區塊級作用域。
關於作用域的內容,大家可以查到別的資料,這部分內容相對簡單。

「this」上下文

上下文(context)通常取決於函數被呼叫的方式。當函數作為物件的方法被呼叫時,「this」指涉的是呼叫該函數的物件。

複製程式碼 程式碼如下:

var obj={
    foo:function (){
        console.log(this === obj);
    }
};
obj.foo();   //輸出true

同樣,當我們使用「new」關鍵字建立新物件時,this引用的是新建立的物件。
複製程式碼 程式碼如下:

function foo(){
    console.log(this);
}
foo();         //輸出window
var obj=new foo();     //輸出 foo {}

有一點要注意的是,當全域作用域中的函數被呼叫時,this引用的是全域對象,在瀏覽器環境中指的就是window。但是,如果在嚴格模式下運行程式碼時,「this」被設定為「undefined」
執行上下文(Execution Context)

Javascript是單執行緒的語言,這也就是說Javascript在瀏覽器中執行時,一次只能做一件事情,其他的事情將被方法佇列中,等待被處理。

1.當Javascript程式碼檔案被瀏覽器載入後,預設最新進入的是一個全域的執行上下文。當在全域上下文中呼叫函數時,程式留就進入該被呼叫函數內,此時Javascript引擎就會為該函數建立一個新的執行上下文,並且將其壓入到執行上下文堆疊的頂部。瀏覽器總是執行當前在堆疊頂部的上下文,一旦執行完畢,該上下文就會從堆疊頂部被彈出,然後,進入其下的上下文執行程式碼。這樣,堆疊中的上下文就會被依序執行並且彈出堆疊,直到回到全域的上下文。

2.一個執行上下文可以被分成兩個階段:建立階段和執行階段。在創建階段,javascript解釋器首先會創建一個變數物件(也成為“活動物件”,activation object)。活動物件由變量,函數宣告和參數組成。在這個階段,函數的作用域鏈被初始化,this引用的物件也被確定。接下來就是執行階段,在這個階段,程式碼被解釋並執行。
在Javascript程式碼中,可以有任意多個函數上下文,我們已經知道,當函數被呼叫時,Javascript解釋器就會建立一個新的上下文,同時會建立一個私有的作用域,函數內部宣告的任何變數都不能在目前函數作用域外部直接存取。

3.透過上面的解釋,我們對函數的「執行上下文」有了一個基本的概念,但是這裡也是大家最容易迷惑的一個地方。 Javascript中的「執行上下文」主要是指作用域,而不是上面第四小節所指的「this上下文」。類似的容易混淆的概念在Javascript中還有很多,但是我們只要弄清楚了每個概念所指代的具體對象,就不會再迷惑,因此,這裡也希望大家能夠真正的區分開“執行上下文”和“this上下文”。

簡單的一句話概括來說,執行上下文是與作用域相關的概念,雖然這樣說可能不太嚴謹。

作用域鏈

對每一個執行上下文來說,都有一個作用域連跟它綁在一起。作用域鏈包含了執行上下文堆疊中的執行上下文活動物件(activation object,聽起來有點繞口)。作用域鏈決定了變數的存取和識別碼的解析。

程式碼範例:

複製程式碼 程式碼如下:

function first(){
    second();
    function second(){
        third();
        function third(){
            fourth();
            function fourth(){
                //代碼
            }
        }
    }
}
first();

執行上面的程式碼,巢狀的函數都會被執行。就上面的程式碼來說,也會形成一個作用域鏈,作用域鏈從頂部到底部的順序為:fourth, third, second, first, global。函數fourth可以存取全域作用域中的變量,並且可以存取函數third, second, first中定義的任何變數。
有一點要注意的是,在函數體內,局部變數的優先權高於同名的全域變數。如果在函數內宣告的局部變數或函數參數中帶有的變數和全域變數重名,那麼全域變數就被局部變數所覆蓋。
簡單來說,每次我們嘗試訪問一個變量時,程式都會在當前函數作用域內查找變量,如果找不到就沿著作用域鏈到該函數的上層去查找,直到找到該變量為止,如果找不到則回傳undefined。

總結

這篇文章介紹了javascript中上下文和作用域的相關概念,javascript中還有幾個比較重要的概念,如閉包等,這些在以後自己弄明白了會寫成文章~~

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python vs. JavaScript:開發人員的比較分析Python vs. JavaScript:開發人員的比較分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要區別在於類型系統和應用場景。 1.Python使用動態類型,適合科學計算和數據分析。 2.JavaScript採用弱類型,廣泛用於前端和全棧開發。兩者在異步編程和性能優化上各有優勢,選擇時應根據項目需求決定。

Python vs. JavaScript:選擇合適的工具Python vs. JavaScript:選擇合適的工具May 08, 2025 am 12:10 AM

選擇Python還是JavaScript取決於項目類型:1)數據科學和自動化任務選擇Python;2)前端和全棧開發選擇JavaScript。 Python因其在數據處理和自動化方面的強大庫而備受青睞,而JavaScript則因其在網頁交互和全棧開發中的優勢而不可或缺。

Python和JavaScript:了解每個的優勢Python和JavaScript:了解每個的優勢May 06, 2025 am 12:15 AM

Python和JavaScript各有優勢,選擇取決於項目需求和個人偏好。 1.Python易學,語法簡潔,適用於數據科學和後端開發,但執行速度較慢。 2.JavaScript在前端開發中無處不在,異步編程能力強,Node.js使其適用於全棧開發,但語法可能複雜且易出錯。

JavaScript的核心:它是在C還是C上構建的?JavaScript的核心:它是在C還是C上構建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; sanInterpretedlanguagethatrunsonenginesoftenwritteninc.1)JavascriptwasdesignedAsignedAsalightWeight,drackendedlanguageforwebbrowsers.2)Enginesevolvedfromsimpleterterpretpretpretpretpreterterpretpretpretpretpretpretpretpretpretcompilerers,典型地,替代品。

JavaScript應用程序:從前端到後端JavaScript應用程序:從前端到後端May 04, 2025 am 12:12 AM

JavaScript可用於前端和後端開發。前端通過DOM操作增強用戶體驗,後端通過Node.js處理服務器任務。 1.前端示例:改變網頁文本內容。 2.後端示例:創建Node.js服務器。

Python vs. JavaScript:您應該學到哪種語言?Python vs. JavaScript:您應該學到哪種語言?May 03, 2025 am 12:10 AM

選擇Python還是JavaScript應基於職業發展、學習曲線和生態系統:1)職業發展:Python適合數據科學和後端開發,JavaScript適合前端和全棧開發。 2)學習曲線:Python語法簡潔,適合初學者;JavaScript語法靈活。 3)生態系統:Python有豐富的科學計算庫,JavaScript有強大的前端框架。

JavaScript框架:為現代網絡開發提供動力JavaScript框架:為現代網絡開發提供動力May 02, 2025 am 12:04 AM

JavaScript框架的強大之處在於簡化開發、提升用戶體驗和應用性能。選擇框架時應考慮:1.項目規模和復雜度,2.團隊經驗,3.生態系統和社區支持。

JavaScript,C和瀏覽器之間的關係JavaScript,C和瀏覽器之間的關係May 01, 2025 am 12:06 AM

引言我知道你可能會覺得奇怪,JavaScript、C 和瀏覽器之間到底有什麼關係?它們之間看似毫無關聯,但實際上,它們在現代網絡開發中扮演著非常重要的角色。今天我們就來深入探討一下這三者之間的緊密聯繫。通過這篇文章,你將了解到JavaScript如何在瀏覽器中運行,C 在瀏覽器引擎中的作用,以及它們如何共同推動網頁的渲染和交互。 JavaScript與瀏覽器的關係我們都知道,JavaScript是前端開發的核心語言,它直接在瀏覽器中運行,讓網頁變得生動有趣。你是否曾經想過,為什麼JavaScr

See all articles

熱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

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

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Mac版

SublimeText3 Mac版

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

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具