函數在執行以前會產生一個上下文對象,即Activeaction Object,簡稱AO對象。
AO對象初始爲一個空對象,可是裏面有一些隱含的默認屬性,好比:this:window, arguments: []。
在預編譯過程當中將會對該對象進行屬性的添加等操做。
複製代碼
假若有如下代碼:前端
function test (a, b) {
console.log(a);
function a () {};
a = 10;
console.log(a);
function b () {};
console.log(b);
var b = 111;
var a = 0;
}
test(2);
複製代碼
接下來分別按照上面的4個步驟進行執行函數
//此時AO對象爲
AO = {
this: window,
arguments: [],
...等隱含屬性
}
複製代碼
// 形參爲a,b, 變量聲明瞭a,b
// 此時AO對象爲
AO = {
// ...默認屬性
a: undefined,
b: undefined,
}
複製代碼
AO = {
// ...默認屬性
a: 2,
b: undefined,
}
複製代碼
AO = {
// ... 默認屬性
a: function a () {},
b: function b () {},
}
複製代碼
至此預編譯階段完成,接下來將進行js的執行。ui
function test (a, b) {
console.log(a); // 此時AO對象中a爲function a () {}
function a () {};
a = 10; // 對a賦值爲10
console.log(a); // 10
function b () {};
console.log(b); // function b () {}
var b = 111; // 對b賦值爲 111
var a = 0; // 對a賦值爲 0
}
test(2);
複製代碼
因此執行結果應該爲this
身爲一名初入前端的菜鳥,但願本身能夠把成長的經歷記錄下來,以上爲我的理解,若有不足,歡迎斧正。複製代碼