在函數運行時, 會先進行詞法分析(預編譯) 預編譯做哪些工作?
1:分析參數
2:分析變量聲明
3:分析函數聲明
如何分析變量聲明?
答:對於var 聲明的變量, 以var str = 'local'為例, 分為分析過程 和 執行過程.
先分析, 后執行.
先分析 var str; ,即僅僅聲明一個str變量,str變量此時,沒有賦值,值是undefined
然后再進行 執行過程.
var str = 'global'; function t() { /* alert(str); // undefined var str = 'local'; alert(str); // local */ /// 詞法分析 var str; // 執行語句 alert(str); str = 'local'; alert(str;); } t();
活動對象/激活對象, Active Object
函數的變量 有其作用域,
即, 引用某變量時,在某個范圍內查詢該變量, 這個范圍,又在哪兒?
在AO上找
在函數調用的瞬間,會產生一個AO, 這個AO對象,的屬性, 即存儲着該函數所能引用到的變量.
function fn1(age,hei) { var age; alert(age); // 32 alert(hei); // undefined } fn1(32);
function fn1(age,hei) { var age; alert(age); function age() { alert('hehe'); } } fn1(32); /* //詞法分析過程 AO:{} AO:{age:undefined,hei:undefined} AO:{age:32,hei:undefined} AO:{age:function(){alert('hehe')},hei:undefined} // 執行: alert(age); --->AO.age--->函數 */
function t(age) { alert(age); // 99 var age = 12; alert(age); // 12 } t(99); AO:{age:undefined} // 詞法分析形參得到 AO:{age:99} // 實參賦值 AO.age屬性 AO:{age:12} // 修改AO.age的值
function a(b) { alert(b); // function b(){} function b(){ alert (b); // } b(); } a(1); /* //詞法分析過程 a:AO:{} a:AO:{b:undefined} a:AO:{b:function} b:AO {} b:AO.b --->{}--->a:AO // 執行: alert(age); --->AO.age--->函數 */
// 函數聲明 與函數表達式 // 函數表達式 function fn1(age,hei) { alert(age); var age = function () { alert('hehe'); } alert(age); } // undefined, function // function,function // 32, function (正確) fn1(32); // 函數聲明 function fn1(age,hei) { alert(age); function age () { alert('hehe'); } alert(age); } // undefined, function // function,function (正確) // 32, function fn1(32);
