先來看兩個例子
var x = 10;
bar(); //10
function foo()
function bar()
解析
執行bar,相當於執行foo(),foo裡面要輸出x,我們首先要從foo自己的作用域下面去找
foo裡邊是沒有宣告x的,然後我們會到foo的詞法作用域去找,也就是宣告foo的作用域去找。
在這裡foo的詞法作用域就是全域性作用域,全域性作用域裡宣告的x=10,所以輸出10
var x = 10;
bar(); //30
function bar()
foo();
}
解析
執行bar(),就會執行foo().foo裡輸出x,我們首先找foo的作用域裡,發現沒有宣告x
那就接著找foo的詞法作用域。也就是宣告foo的作用域,發現有x=30,於是輸出了30
一 、execution context (執行上下文,也叫執行環境):
二 、scope chain(作用域鏈),activation object(活動物件)
三 、[[scope]]屬性
//範例1
var x = 10;
bar(); //10
function foo()
function bar() ,
scope:null
}宣告bar時 得到下面:
bar().[[scope]] = global context.ao
宣告foo時 得到下面:
foo().[[scope]] = global context.ao
執行**的時候,當我們需要乙個值,會首先從它的活動物件裡去找,如果找不到就要到它的[[scope]] 裡去找。
2.當呼叫bar()時,進入bar的執行上下文
因為bar裡值宣告了乙個x,所以bar的活動物件裡只有乙個x
barcontext = ,
scope :bar.[[scope]] //global context.ao
}3. 當呼叫foo()的時候,進入foo的執行上下文
foocontext =
scope:foo.[[scope]] //global context.ao
}
如何理解作用域鏈
在js中作用域是什麼?何為作用域 任何程式語言都有作用域的概念,簡單來說,作用域就是變數與函式的可訪問範圍,即作用域控制著變數與函式的可見性和生命週期。js的作用域是靠函式來形成的,也就是說乙個函式的變數在函式外不可以訪問。1全域性作用域也就是go 任何地方都能訪問到的物件擁有全域性作用域。1.1函...
理解作用域鏈和原型鏈
作用域鏈的概念 要理解es中作用域鏈,首先要從理解執行環境開始。es中 執行都是在乙個具體的執行環境中進行的,每個執行環境有乙個與之關聯的變數物件,該變數中包含著在這個執行環境中可以訪問的變數和函式。這裡所說的執行環境就相當於作用域。最外圍的執行環境是全域性環境,在web瀏覽器中也就是window物...
JS深入理解作用域 作用域鏈,變數提公升
1 作用域 1 全域性作用域 在瀏覽器載入我們html頁面的時候,首先會開闢乙個供js 執行的環境,即全域性作用域,這是乙個棧記憶體 2 私有作用域 函式執行時,開闢乙個新的棧記憶體,形成私有作用域 2 基本資料型別與引用資料型別區別?基本資料型別 string,number,boolean,nul...