<html>
<script type="text/javascript">
/*作用域
在js中,函數嵌套是非常普遍的,在函數嵌套中,
對變量是如何尋找的?
答:首先在函數內部尋找,如果需找不到,則在外層尋找。
直到……全局(window)區域.從里往外尋找
*/
var c=5;
function t1(){
var d=6;
function t2(){
var e =7;
alert(c+d+e);
}
t2();
}
//t1();//18
function t3(){
var d=6;
function t2(){
var e =7;
d =3;
alert(c+d+e);
}
t2();
}
//t3();//15
/*聲明變量,var的作用
var 是在函數運行的上下文中,聲明一個變量,
如果不加var,則是一個賦值操作,
但是不要狹隘的理解為聲明了一個全局變量
*/
//alert(window.d);
//alert(window.e);
function t(){
d=5;//d沒有加var,僅僅是一個賦值操作,尋找
//t域內的函數,如果沒找到,繼續向外尋找……到window
//如果window中還沒有d,創建d變量并賦值
var e=6;
}
//t();
//alert(window.d);
//alert(window.e);
function t4 (){
var d;
function t2(){
d=5;
e=6;
}
t2();
}
//t4();
//alert(window.d);//undefined
//alert(d);// d is not defined
//alert(e);
/*
注意:以window.xxx引用全局變量,尋找不到,
作為window的屬性不存在,返回undefined。
直接以xxx引用,尋找不到,則報xxx is not defined
*/
var s1='g';
function t5(){
alert(s1);//g
alert(s2);//is not defined
s2 = 'lo';
}
// t5();
/*
在t5中尋找s2,沒有找到s2的變量聲明,到window上尋找s2的變量聲明,
還是沒有找到,報is not defined
*/
function t6(){
alert(s1);//g
alert(s2);//undefined
var s2 = 'lo';
}
t6();
/*
解釋:
js代碼自上而下執行,但是js代碼的整體運行分為:
詞法分析期和運行期
自上而下執行之前,先有一個詞法分析過程。
詞法分析t6函數:
聲明了s2變量,但是沒有對s2賦值,只有在運行期才賦值
因此s2=undefined。
執行t6函數:
alert(s1);//g
alert(s2);//undefined
s2 = 'lo';
*/
</script>
</html>