js处理上下文代码的2个阶段
生活随笔
收集整理的這篇文章主要介紹了
js处理上下文代码的2个阶段
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、進入執行上下文
當進入執行上下文(代碼執行之前)時,VO里已經包含了下列屬性(前面已經說了):
函數的所有形參(如果我們是在函數執行上下文中)
— 由名稱和對應值組成的一個變量對象的屬性被創建;沒有傳遞對應參數的話,那么由名稱和undefined值組成的一種變量對象的屬性也將被創建。
所有函數聲明(FunctionDeclaration, FD)
—由名稱和對應值(函數對象(function-object))組成一個變量對象的屬性被創建;如果變量對象已經存在相同名稱的屬性,則完全替換這個屬性。
所有變量聲明(var, VariableDeclaration)
— 由名稱和對應值(undefined)組成一個變量對象的屬性被創建;如果變量名稱跟已經聲明的形式參數或函數相同,則變量聲明不會干擾已經存在的這類屬性。
function test(a, b) {var c = 10;
function d() {}
var e = function _e() {};
(function x() {});
}
test(10); // call
當進入帶有參數10的test函數上下文時,AO表現為如下: AO(test) = {
a: 10,
b: undefined,
c: undefined,
d: <reference to FunctionDeclaration "d">
e: undefined
};
AO里并不包含函數“x”。這是因為“x” 是一個函數表達式(FunctionExpression, 縮寫為 FE) 而不是函數聲明,函數表達式不會影響VO。
2、執行代碼
var x = 10;
alert(x); // 10
x = 20;
function x() {};
alert(x); // 20
為什么第一個alert “x” 的返回值是function,而且它還是在“x” 聲明之前訪問的“x” 的?為什么不是10或20呢?
因為,根據規范函數聲明是在當進入上下文時填入的; 同意周期,在進入上下文的時候還有一個變量聲明“x”,那么正如我們在上一個階段所說,
變量聲明在順序上跟在函數聲明和形式參數聲明之后,而且在這個進入上下文階段,變量聲明不會干擾VO中已經存在的同名函數聲明或形式參數聲明,
因此,在進入上下文時,VO的結構如下 VO = {};
VO['x'] = <reference to FunctionDeclaration "x">
// 找到var x = 10;
// 如果function "x"沒有已經聲明的話
// 這時候"x"的值應該是undefined
// 但是這個case里變量聲明沒有影響同名的function的值
VO['x'] = <the value is not disturbed, still function>
轉載于:https://www.cnblogs.com/ftxc/p/8404969.html
總結
以上是生活随笔為你收集整理的js处理上下文代码的2个阶段的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 晚上梦到你了怎么回复
- 下一篇: 怀孕梦到鱼预示着什么