乙個關於JS作用域鏈的例子

2021-07-13 07:34:12 字數 1179 閱讀 4265

乙個關於js作用域鏈的例子,**如下:

**1

var x = 10;

function

foo()

(function

() )();

執行結果:

**2

var x = 10;

function

foo()

(function

() )();

執行結果:

簡單分析:

兩段**唯一的區別是第6行,即匿名函式中對變數x的賦值。**1,var x = 20,**2,x = 20。

在函式建立時,就具有[[scope]]屬性,[[scope]]屬性是包含了其父環境中的所有變數物件的集合,不管這個函式有沒有被呼叫,它的[[scope]]屬性會一直存在於函式物件中,直到函式物件被銷毀。

對於函式foo而言,foo.[[scope]] = [global.vo] = 。

而函式的ao(函式的變數物件, activation object)和作用域鏈scope chain則是在函式呼叫時才會生成,

scope chain是識別符號解析的依據,js直譯器會沿著scope chain從下到上來尋找識別符號所在的變數物件。scope chain = ao + function.[[scope]]。

在**1中,在匿名函式中宣告新的變數var x = 20,當進入匿名函式的執行上下文時,變數x會被填充到該上下文的ao中去,ao=;呼叫foo函式,foo則會沿著它自己的scope chain尋找識別符號x,由於foo的ao是空的,直譯器就在foo的[[scope]]屬性中找變數x,foo.[[scope]] = [global.vo] = [,於是在global.vo中找到了,這個值為10,注意,匿名函式的ao與foo的[[scope]]屬性是沒有關係的,[[scope]]屬性只有建立函式的上下文有關,與呼叫函式時的上下文沒有關係。

在**2中,在匿名函式中對全域性變數的x重新賦值為20,呼叫foo函式,foo在其[[scope]]屬性中找到了位於global的vo中的變數x,而此時x的值為20,因此列印結果20。

變數物件,作用域鏈,執行上下文的知識請參考變數物件,作用域鏈

乙個例子看懂js函式作用域

var myobject myobject.func 程式的輸出是什麼?依次輸出bar bar undefined bar 理解關鍵 方法 函式是由誰 物件 呼叫 的,方法 函式內部的這就是指向誰 該物件 注意 被誰 呼叫,不是處於誰的作用域,即使在作用域 1,func是由myobject呼叫的,這...

記錄乙個關於變數作用域的神奇例子

程式中的變數並不是說訪問就能訪問的,每個變數都有使用範圍,也就是變數都有自己的作用域。看示例1 示例1 b 3 deff1 a print a,b if name main f1 3 輸出結果 3 3雖然函式f1中並沒有定義b,但是可以使用全部變數b,再看示例2,可能會讓你跌眼鏡 示例2 b 3 d...

js的作用域鏈

js作用域鏈就是函式或者變數在何處能被訪問。那就要看js引擎怎麼去處理程式的執行。1.在程式執行的前一刻建立活動物件 函式作用域 執行期上下文 go ao 2.將var關鍵字宣告的變數作為go物件的屬性名,賦值為undefined,如果存在變數重名,則後乙個把前乙個覆蓋 3.將function 宣告...