預解析
在一段js**拿過來真正一句一句執行之前,瀏覽器會做一些「準備工作」,就是執行上下文(預解析)
函式或者變數都會有提前解析的過程,js會把函式或者變數提前解析一下,解析到它們對應的作用域最開始的地方
步驟:1、先找var,function關鍵字以及引數
2、如果找到了var(宣告的變數、引數)會給他賦乙個undefined,如果找到了function,那會把整個函式都拿過來
3、把找到的東西放在對應作用域的最開始的位置
4、逐行執行**
/*var c=undefined
function test()*/1
var c=10;
2function
test()
6 test(); //
107 console.log(c); //208
/*9原理:10
1、找到了var c=undefined test(){} 整個**塊
112、逐行解讀** c=10 函式test呼叫了
123、遇到乙個新的**塊,找var,沒有找到,逐行解讀**,console.log(c),往外找c
134、往下走c 被重新賦值 20
14*/
/*var d=undefined
function test1(d)
*/15
var d=12;
16function
test1(d)
20test1();
21 console.log(d); //
1222
/*23
1、找到var d=undefined
24function test1(d) 放在作用域最開始的地方
282、逐行解讀**,d被賦值12,函式test1()呼叫,
29有形參d,賦值var d=undefined 放在函式test1的最上面,
30d 被賦值24,注意是test1函式裡的作用域內的d,並不是外面的d,函式呼叫完就被釋放
31*/
32 /*
var e=13;
function test2(e)
*/33
var e=13;
34function
test2(e)
38test2(e);
39 console.log(e); //
1340
/*41
1、找var 跟函式
42var e=undefined
43function test2(e) 放在作用域的最前面
472、逐行解讀** e被賦值為 13
48函式呼叫,逐行走函式 test2內**
49函式test2**塊內預解析,有形參e,
50e=undefined 放在函式最開始的位置
51函式呼叫的時候有實參e,就是13 被傳進來
52所以console.log(e)為13 ,之後e 又被賦值為54,但注意是test2作用域內的e
53*/
函式預解析
1、函式宣告
可以被預解析,可以先呼叫再宣告
2、函式表示式
函式表示式不會被預解析,只能先宣告再呼叫,不能先呼叫再宣告(不然報錯)
1 test(); //不會報錯
2function
test()5/*
6函式test()被預解析放在了作用域的最前面,所以可以呼叫7*/
8 test1(); //
報錯 test1 為undefined, undefined() 肯定報錯
9var test1=function
()
12//
找到了var test1放在了作用域最前面並被賦值 undefined ,但函式表示式的函式不會被預解析
13//
逐行解讀** undefined();肯定會報錯
我們總結一下,在「準備工作」中完成了哪些工作:
這三種資料的準備情況我們稱之為「執行上下文」或者「執行上下文環境」。
js執行上下文與執行上下文棧
在了解js的執行上下文物件與執行上下文棧之前,我們要先了解兩個概念 即變數提公升跟函式提公升 變數提公升 通過var定義的變數,在定義語句之前我們就可以直接訪問到,不過它的值是undefined 函式提公升 通過function定義的函式,在函式定義語句前,我們就可以直接呼叫 變數提公升與函式提公升...
JS執行上下文
執行上下文,即context,也不知道是誰翻譯的,不少的文獻 書籍用的都是這個詞。還記得第一次接觸這個詞時的惆悵 迷惘 不知所措,扶了扶眼鏡,翻開大辭典,還是翻譯成環境比較接地氣。js執行上下文,即js的執行環境。當我們的 執行時,會進入到不同的執行上下文,即不同的環境。在不同的環境中,有著不同的 ...
JS 執行上下文棧
繼續上文的內容。執行全域性 時,會產生乙個執行上下文環境,每次呼叫函式都又會產生執行上下文環境。當函式呼叫完成時,這個上下文環境以及其中的資料都會被消除,再重新回到全域性上下文環境。處於活動狀態的執行上下文環境只有乙個。其實這是乙個壓棧出棧的過程 執行上下文棧。如下圖 可根據以下 來詳細介紹上下文棧...