一:JavaScript中的“上下文“指的是什么
百科中這樣定義:
上下文是從英文context翻譯過來,指的是一種環境。
在軟件工程中,上下文是一種屬性的有序序列,它們為駐留在環境內的對象定義環境。
在對象的激活過程中創建上下文,對象被配置為要求某些自動服務,如同步、事務、實時激活、安全性等等。又比如計算機技術中,相對於進程而言,上下文就是進程執行時的環境。
具體來說就是各個變量和數據,包括所有的寄存器變量、進程打開的文件、內存信息等。
JavaScript的執行上下文的理解是一種大概模糊的理解(譯者)。
上下文的原意是content,而作用域的原意是scope。
scope指的是 函數被調用的時候, 各個變量的作用區域
content指的是 函數被調用的時候, 查看 this指向哪個object, 那么那個
content指的是 函數被調用的時候, 查看 this指向哪個object, 那么那個
object
就是當前的 "上下文"。
反正我的理解就是:當前執行環境的作用域,因為“上下文”如果離開了執行環境就沒有啥實際意義了。
二:JavaScript的兩個階段都干了啥
(1)預“編譯”階段(一定要注意,這個編譯,不是編譯成機器碼的編譯):
瀏覽器的JavaScript引擎“解析”JavaScript代碼。
建立arguments對象(隱藏對象,不可見),函數,參數,變量
建立作用域鏈
確定this的值(或者說指向)
(2)代碼執行階段
瀏覽器的JavaScript引擎一步步執行代碼段,從上至下。
給變量賦值,確定函數的引用。
三:具體代碼分析
function foo(z){ var a="Hi"; var b=function(){ }; function c(){ } } foo("zqz")
預“編譯”階段:
z—>undefined
a—>undefined;
b—>undefined;
c—>function (){}
執行階段:
z—>"zqz";
a—>"Hi";
b—>function (){};
c—>function c(){}
這里面還有個問題:構建執行環境作用域時,arguments對象(隱藏對象,不可見),函數,參數,變量的聲明與構建有先后順序。
arguments對象(隱藏對象,不可見)—>函數—>參數—>變量
function foo(z){ console.log(a); console.log(b); var a = 'Hi'; var b = function() { }; function a() { } console.log(a); console.log(b); } foo("zqz")
結果:function a(){}
undefined //是變量聲明
Hi
function b(){}
按順序走一遍:arguments—>function a(){}—>z—>var a='Hi';var b=function(){}