提公升 執行上下文和執行上下文棧

2021-09-29 12:59:07 字數 2261 閱讀 8270

-提公升

1.變數宣告提公升

通過var定義(宣告)的變數,在之前就可以直接使用,但不會被賦值

值:undefined

2.函式宣告提公升

通過function宣告的函式,在之前就可以直接呼叫 (函式表示式不能在定義前呼叫)

值:函式定義(物件)

3.問題:變數提公升和函式提公升怎麼產生的?

/*

變數提公升簡單理解

*/var a = 3

function fn()

fn() //undefined //變數提公升

console.log(b) //undefined //變數提公升

fn2() //lala //函式提公升

// f3() //報錯,未定義

console.log(fn3) //undifined (函式表示式建立的函式不會被提前建立)

var b = 3

function fn2()

var fn3 = function()

/*測試題1

先執行變數提公升還是函式提公升?

先執行變數提公升

*/function a(){}

var a;

console.log(typeof a) //function

/*測試題2

*/if(!(b in window))

console.log(b) //undefined

/*測試3

*/var c = 1

function c(c)

c(2) //報錯 c is not a function 函式宣告提公升,早就被執行好了

測試3理解

/* 它相當於*/

var c;

function c(c)

c = 1;

console.log(c) //1

執行上下文

1.**分類(位置)

全域性**

函式(區域性)**

2.全域性執行上下文

在執行全域性**前將window確定為全域性執行上下文

對全域性變數進行預處理 :

var定義的全域性變數–>undefined ,新增為window的屬性

function宣告的全域性函式–>賦值(fun),新增為window的方法

this -->賦值,為window

開始執行全域性**

3.函式執行上下文

在呼叫函式,準備執行函式體之前,建立對應的函式執行上下文物件

對區域性變數進行預處理 :

形參變數–>賦值(實參)–>新增為執行上下文的屬性

arguments -->賦值(實參)–>新增為執行上下文的屬性

var定義的區域性變數–>undefined,新增為執行上下文的屬性

function宣告的函式–>賦值(fun),新增為執行上下文的方法

this -->賦值(使用函式的物件)

//全域性執行上下文

console.log(window.a) //undefined

console.log(window.fn2) //function()

console.log(this) //window

//函式執行上下文

function myfunction(a1)

console.log(this) //window

m1() //window

console.log(arguments) //偽陣列[2,3]

var m=3

function m1()

}myfunction(2,3)

/*

面試題:

輸出結果是怎樣的? //棧的特點:後進先出

gb undefined

fb1fb2

fb3fe3

fe2fe2

ge1整個過程產生了幾個執行上下文?

5個*/

console.log('gb '+ i)

var i =1

foo(1)

function foo(i)

console.log('fb' +i)

foo( i+1 )

console.log('fe' +i)

}console.log('ge' +i)

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

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

執行上下文棧

如果要問到 j ascript 執行順序的話,想必寫過 j ascript 的開發者都會有個直觀的印象,那就是順序執行,畢竟 var foo function foo foo1 var foo function foo foo2 然而去看這段 function foo foo foo2 functi...

上下文 上下文棧

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