摘要:JavaScript, scope chain
function wl(s){document.write((s||'')+"<br />\r\n");}
function test1() {
return say();
function say() {
return 't';
}
}
wl('1:'+test1());//t
var t2 = 20;
function test2() {
return say();
var t2 = 10;
function say() {
return t2;
}
}
wl('2:'+test2());//undefined
/*
undefined?我以為是 20....囧a
return 後面不執行,裡面找不到 t2,那應該會去找外面吧…
*/
var t2_1 = 20;
function test2_1() {
return say();
function say() {
return t2_1;
}
}
wl('2_1:'+test2_1());//20
/*
所以....宣告不管寫在哪都會被拉到前面?
function test2() {
return say();
var t2 = 10;
function say() {
return t2;
}
}
被解釋成這樣? ↓
function test2() {
var t2;
return say();
t2 = 10;
function say() {
return t2;
}
}
*/
var t3 = 20;
function test3() {
return say();
var t3 = 10;
function say() {
return this.t3;
}
}
wl('3:'+test3());//20, this=window
var t4 = 20;
function test4() {
var t4 = 10;
return say();
function say() {
return t4;
}
}
wl('4:'+test4());//10, closure
var t5 = 20;
function test5() {
var t5 = 10;
return say();
function say() {
return this.t5;
}
}
wl('5:'+test5());//20
var t6 = 20;
function test6() {
this.t6 = 10;
function say() {
return this.t6;
}
this.g=say;
return say();
}
var obj=new test6();
wl('6 new:'+obj.g());//10
wl('t6:'+t6);//20
wl('6 :'+test6());//10 沒加 new會動到全域(window)變數
wl('t6:'+t6);//10
wl('6 new:'+obj.g());//10