js 3 物件 7 執行上下文 this

2021-08-14 15:22:39 字數 2513 閱讀 2008

執行環境定義了變數或函式有權訪問的其他資料,決定了它們各自的行為。

每個執行環境都有乙個與之關聯的變數物件,環境中定義的所有變數和函式都儲存在這個物件中。

全域性執行環境是最外圍的乙個執行環境。在web瀏覽器中,全域性執行環境被認為是window 物件,因此所有全域性變數和函式都是作為window 物件的屬性和方法建立的。

某個執行環境中的所有**執行完畢後,該環境被銷毀,儲存在其中的所有變數和函式定義也隨之銷毀。

在內部環境可以讀取外部環境的變數,反之則不行。

這三種資料的準備情況我們稱之為「執行上下文」或者「執行上下文環境」。

如果**段是函式體,那麼在此基礎上需要附加:

一點不同在於,函式在定義的時候(不是呼叫的時候),就已經確定了函式體內部自由變數的作用域。所以

1.在函式體的語句執行之前,arguments變數和函式的引數都已經被賦值。

2.函式每被呼叫一次,都會產生乙個新的執行上下文環境。因為不同的呼叫可能就會有不同的引數。

給執行上下文環境下乙個通俗的定義——在執行**之前,把將要用到的所有的變數都事先拿出來,有的直接賦值了,有的先用

undefined

占個空。

執行全域性**時,會產生乙個執行上下文環境,每次呼叫函式都又會產生執行上下文環境。當函式呼叫完成時,這個上下文環境以及其中的資料都會被消除,再重新回到全域性上下文環境。處於活動狀態的執行上下文環境只有乙個。其實這是乙個壓棧出棧的過程

——執行上下文棧。

在執行**之前,首先將建立全域性上下文環境。

然後是**執行。**執行到第12行之前,上下文環境中的變數都在執行過程中被賦值。

執行到第13行,呼叫bar函式。

跳轉到bar函式內部,執行函式體語句之前,會建立乙個新的執行上下文環境。

並將這個執行上下文環境壓棧,設定為活動狀態。

執行到第5行,又呼叫了fn函式。進入fn函式,在執行函式體語句之前,會建立fn函式的執行上下文環境,並壓棧,設定為活動狀態。

待第5行執行完畢,即fn函式執行完畢後,此次呼叫fn所生成的上下文環境出棧,並且被銷毀(已經用完了,就要及時銷毀,釋放記憶體)。

同理,待第13行執行完畢,即bar函式執行完畢後,呼叫bar函式所生成的上下文環境出棧,並且被銷毀(已經用完了,就要及時銷毀,釋放記憶體)。

解析器在呼叫函式每次都會向函式內部傳遞進乙個隱含的引數,這個隱含的引數就是this,this指向的是乙個物件,這個物件我們稱為函式執行的 上下文物件,

根據函式的呼叫方式的不同,this會指向不同的物件

1.以函式的形式呼叫時,this永遠都是window

2.以方法的形式呼叫時,this就是呼叫方法的那個物件

3.當以建構函式的形式呼叫時,this就是新建立的那個物件

注意呼叫方式

如果直接呼叫person, 這種情況下this是window,我們後文中會說到。相當於情況一

建構函式的prototype中,this代表著什麼。相當於情況二

在fn.prototype.getname函式中,this指向的是f1物件。因此可以通過this.name獲取f1.name的值。其實,不僅僅是建構函式的

prototype

,即便是在整個原型鏈中,

this

代表的也都是當前物件的值。

在事件處理程式內的this 所引用的物件即是設定了該事件處理程式的元素。也就是事件是給那個物件繫結的this就是哪個物件。

此時name,沒用this,在fun()中並沒有找到name,就往全域性裡面找

使用this,當obj呼叫時,此時this就是obj,在fun()沒有找到name,就往obj裡面找,找到name,完畢。obj2也是如此

js執行上下文與執行上下文棧

在了解js的執行上下文物件與執行上下文棧之前,我們要先了解兩個概念 即變數提公升跟函式提公升 變數提公升 通過var定義的變數,在定義語句之前我們就可以直接訪問到,不過它的值是undefined 函式提公升 通過function定義的函式,在函式定義語句前,我們就可以直接呼叫 變數提公升與函式提公升...

JS執行上下文

執行上下文,即context,也不知道是誰翻譯的,不少的文獻 書籍用的都是這個詞。還記得第一次接觸這個詞時的惆悵 迷惘 不知所措,扶了扶眼鏡,翻開大辭典,還是翻譯成環境比較接地氣。js執行上下文,即js的執行環境。當我們的 執行時,會進入到不同的執行上下文,即不同的環境。在不同的環境中,有著不同的 ...

JS 執行上下文棧

繼續上文的內容。執行全域性 時,會產生乙個執行上下文環境,每次呼叫函式都又會產生執行上下文環境。當函式呼叫完成時,這個上下文環境以及其中的資料都會被消除,再重新回到全域性上下文環境。處於活動狀態的執行上下文環境只有乙個。其實這是乙個壓棧出棧的過程 執行上下文棧。如下圖 可根據以下 來詳細介紹上下文棧...