Baranovskiy
題目一:
if (!("a" in window)) {
var a = 1;
}
alert(a);
答案:undefined
關鍵點:js的全部變量自動提早聲明
全局變量掛載在window下
題目二:
var a = 1,
b = function a(x) {
return x && (x + a(--x));
};
alert(a);
答案:1
關鍵點:函數聲明與函數表達式的區別;
函數聲明會覆蓋變量聲明但不會覆蓋變量賦值;
聲明的函數名與函數表達式的別名優先放在函數的做用域中;
其餘:執行b(2)獲得3
延伸:
var a = 1;
function a(x) {
return x && (x + a(--x));
};
a依然是1,a(2)會報錯「
TypeError: number is not a function」
補充:解析時先提早聲明後賦值,函數聲明覆蓋變量聲明
再延生:
var a;
function a(x) {
return x && (x + a(--x));
};
執行a(2)獲得3,a++獲得NaN,
將var a;移到最後依然獲得一樣的結果。
題目三:
function a() {
alert(this);
}
a.call(null);a.call({});
答案:[object Window]、[object Object]
關鍵點:call的this指定功用
null將被無視,一樣的還有undefined