標籤:style java strong 資料 width cti
調用JS函數包括兩部分在執行:1.詞法分析 2.執行語句
例1:*/
function test(x,y){
function x(){
alert(x);
}
x();
alert(x);
}
test(100);
詞法分析:
1.函數執行時候,產生Active Object對象
2.AO.x=undefined AO.y=undefined (形參的值都將為undefined)
3.test(100) 只給一個實參 那麼AO.x=100 AO.y值不變
4.遇到function x 那麼AO.x=function x(){alert(x)} (可以理解為函式宣告優先順序大於上面的"賦值方式")
執行:
1
1.1 x() 執行函數x 同樣也分為兩部分:詞法分析和執行
1.2 由於在x的AO對象中沒有x 那麼它將到沿著範圍鏈到上一層找 得到test的AO.x的值並輸出
2 alert(x) 在當前對象AO對象中得到x的值
最後得到輸出結果一樣
例2:
function test(x,y){
var x=15;
function x(){
alert(x);
}
x();
alert(x);
}
test(100);
//result TypeError: x is not a function x();
思路按照上一個例子中的解釋 不過在執行過程中 var x=15; 重新覆蓋了x的值,改變了資料類型,自然x()不是函數了
/*例3:
function a(){
alert(b); //函數b的函數體的所有內容
b();
function b(){
c()
function c(){
d();
function d(){
alert(a); //函數a的函數體的所有內容
}
}
}
}
a();
詞法分析:
1.函數調用時候 產生Active Object對象(嵌套調用時候各自產生AO對象)
2.以a為例 它詞法分析過程中 AO.b=函數b函數體內的所有內容 其它流程都一樣
執行過程:
1.alert(b) 得到屬於a的AO對象中B的值(即函數B的函數體內容)
2.alert(a) 由於所在的d的AO對象中找不到a的值 只能在範圍鏈沿上尋找(就近找值,即尋找每層函數的AO對象中是否含有需要尋找的變數)
複製去Google翻譯翻譯結果