//第一題
? ? (1)
? ? * 代碼看起來是想說:如果window不包含屬性a,就聲明一個變量a,然后賦值為1不从。
? ? * 你可能認(rèn)為alert出來的結(jié)果是1浊洞,然后實際結(jié)果是“undefined”牵敷。要了解為什么,我們需要知道JavaScript里的3個概念法希。
? ? *首先枷餐,所有的全局變量都是window的屬性,語句 var a = 1;等價于window.a = 1; 你可以用如下方式來檢測全局變量是否聲明:
? ? if (!("a" in window)) {
? ? ? ? var a = 1;
? ? }
? ? console.log(window.a);//undefined
? ? alert(a);? //undefined
? ? //(2):解析
? ? * 此時苫亦,盡管聲明是在alert之后毛肋,alert彈出的依然是true怨咪,
? ? * 這是因為JavaScript引擎首先會掃墓所有的變量聲明,然后將這些變量聲明移動到頂部润匙,
? ? alert("b" in window); //true
? ? var b;
? ? // 最終的代碼效果是這樣的:
? ? /!*var b;
? ? alert("b" in window);*!/
//題目二
? ? var a = 1,
? ? ? ? ? ? b = function a(x) {
? ? ? ? ? ? ? ? x && a(--x);
? ? ? ? ? ? };
? ? alert(a);//1
? ? * 這個題目看起來比實際復(fù)雜,alert的結(jié)果是1孕讳;這里依然有3個重要的概念需要我們知道匠楚。
? ? * 首先,在題目1里我們知道了變量聲明在進(jìn)入執(zhí)行上下文就完成了厂财;
? ? * 第二個概念就是函數(shù)聲明也是提前的芋簿,所有的函數(shù)聲明都在執(zhí)行代碼之前都已經(jīng)完成了聲明,和變量聲明一樣璃饱。
? ? 澄清一下与斤,函數(shù)聲明是如下這樣的代碼:
? ? function functionName(arg1, arg2){
? ? //函數(shù)體
? ? ? } ;
? ? *如下不是函數(shù),而是函數(shù)表達(dá)式荚恶,相當(dāng)于變量賦值:
? ? * var functionName = function(arg1, arg2){
? ? ? ? //函數(shù)體
? ? };
? ? *
//題目三
? ? ? function a(x) {
? ? ? ? ? return x * 2;
? ? ? }
? ? ? var a;
? ? ? alert(a);
? ? ? */
? ? /*
? ? * 執(zhí)行a的時候撩穿,相應(yīng)地就彈出了函數(shù)a的內(nèi)容了。
? //題目四
? ? ? function b(x, y, a) {
? ? ? ? ? arguments[2] = 10;
? ? ? ? ? alert(a);
? ? ? }
? ? ? b(1, 2, 6);? //10
? ? ? function b(x, y, a) {
? ? ? ? ? arguments[2] = 10;
? ? ? ? ? alert(a);
? ? ? }
? ? ? b(1, 2);? //undefined
//題目五
? ? ? function a() {
? ? ? ? ? alert(this);
? ? ? }
? ? ? a.call(null);
? ? ? //(2)
? ? ? function method() {
? ? ? ? ? alert(this === window);
? ? ? }
? ? ? method();? ? //true
? ? ? method.call(document);? //false
? ? /*第一個依然是true沒什么好說的裆甩,第二個傳入的調(diào)用對象是document冗锁,自然不會等于window,所以彈出了false嗤栓。*/
? ? ? function a() {
? ? ? ? ? alert(this);
? ? ? }
? ? ? //a.call(window);//[object Window]
? ? ? //總結(jié):這5個題目雖然貌似有點偏冻河,但實際上考察的依然是基本概念,只有熟知了這些基本概念才能寫出高質(zhì)量代碼茉帅。