執行上下文詳解

2021-10-01 02:55:40 字數 2158 閱讀 5363

當執行 js **時,會產生三種執行上下文

每個執行上下文中都有三個重要的屬性

var a = 10

function foo(i)

foo()

對於上述**,執行棧中有兩個上下文:全域性上下文和函式foo上下文。

stack = [

globalcontext,

foocontext

]

對於全域性上下文來說,vo 大概是這樣的

globalcontext.vo === globe

globalcontext.vo =

對於函式foo來說,vo 不能訪問,只能訪問到活動物件(ao)

foocontext.vo === foo.ao

foocontext.ao

// arguments 是函式獨有的物件(箭頭函式沒有)

// 該物件是乙個偽陣列,有 `length` 屬性且可以通過下標訪問元素

// 該物件中的 `callee` 屬性代表函式本身

// `caller` 屬性代表函式的呼叫者

對於作用域鏈,可以把它理解成包含自身變數物件和上級變數物件的列表,通過[[scope]]屬性查詢上級變數

foocontext.[[scope]] = [

globalcontext.vo

]foocontext.scope = foocontext.[[scope]] + foocontext.vo

foocontext.scope = [

foocontext.vo,

globalcontext.vo

]

接下來讓我們看乙個老生常談的例子,var

b() // call b

console.log(a) // undefined

var a = 'hello world'

function b()

想必以上的輸出大家肯定都已經明白了,這是因為函式和變數提公升的原因。通常提公升的解釋是說將宣告的**移動到了頂部,這其實沒有什麼錯誤,便於大家理解。但是更準確的解釋應該是:在生成執行上下文時,會有兩個階段。第乙個階段是建立的階段(具體步驟是建立 vo),js 直譯器會找出需要提公升的變數和函式,並且給他們提前在記憶體中開闢好空間,函式的話會將整個函式存入記憶體中,變數只宣告並且賦值為 undefined,所以在第二個階段,也就是**執行階段,我們可以直接提前使用。

在提公升的過程中,相同的函式會覆蓋上乙個函式,並且函式優先於變數提公升

b() // call b second

function b()

function b()

var b = 'hello world'

var會產生很多錯誤,所以在 es6中引入了letlet不能在宣告前使用,但是這並不是常說的let不會提公升,let提公升了宣告但沒有賦值,因為臨時死區導致了並不能在宣告前使用。

對於非匿名的立即執行函式需要注意以下一點

var foo = 1

(function foo() ()) // -> ƒ foo()

因為當 js 直譯器在遇到非匿名的立即執行函式時,會建立乙個輔助的特定物件,然後將函式名稱作為這個物件的屬性,因此函式內部才可以訪問到foo,但是這個值又是唯讀的,所以對它的賦值並不生效,所以列印的結果還是這個函式,並且外部的值也沒有發生更改。

specialobject = {};

scope = specialobject + scope;

foo = new functionexpression;

foo.[[scope]] = scope;

specialobject.foo = foo; // ,

delete scope[0]; // remove specialobject from the front of scope chain

執行上下文詳解

執行上下文可以理解為當前 的執行環境,它會形成乙個作用域 1.單執行緒 2.同步執行,只有棧頂的上下文處於執行中,其他上下文需要等待 3.全域性上下文只有唯一的乙個,它在瀏覽器關閉時出棧 4.函式的執行上下文的個數沒有限制 5.每次某個函式被呼叫,就會建立乙個新的執行上下文,即使是呼叫的自身函式,也...

執行上下文

1.分類 位置 全域性 函式 區域性 2.全域性執行上下文 在執行全域性 前將window確定為全域性執行上下文 對全域性資料進行預處理 var定義的全域性變數 undefined,新增為window的屬性 function宣告的全域性函式 賦值 fun 新增為window的方法 this 賦值 w...

this執行上下文

this的指向為 誰呼叫當前this所在的函式,this就指向誰。也就是說,當前呼叫函式的那個物件自身就是this,就是當前的執行上下文。被滑鼠事件,鍵盤事件等觸發的函式 叫做事件處理函式,事件處理函式的this指向事件源 觸發事件的節點 事件處理函式第乙個引數是事件物件 備註 有名函式的this指...