幾道容易出錯的JavaScript題目(轉)

下面這幾道JavaScript題目大多來自於週五的一個小分享。都是很小的題目,但是很容易犯錯。有一些是語言特性使然,有一些則是語言本身沒有設計好而留下的陷阱。結果就是,遇到的人很容易陷進去罵娘,這些東西是略有些反直覺,感興趣的不妨看看,平時我們還是儘量少些這樣似是而非的代碼。

1.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
functionContainer( properties ) {
    varobjthis = this;
    for( vari inproperties ) {
        (function(){
                vart = properties[i];
                objthis["get"+ i ] = function() {returnt;};
                objthis["set"+ i ] = function(val) {t = val;};
        })();
    }
}
 
varprop = {Name : "Jim", Age : 13};
varcon = newContainer(prop);
console.log(con.getName());
 
con.setName("Lucy");
console.log(con.getName());
console.log(prop.Name);

這段代碼會輸出什麼?前面兩行分別是“Jim”和“Lucy”,這不會有問題;但是第三行應該輸出的是“Jim”,但是有的人會誤認爲prop對象已被修改,故輸出“Lucy”。其實在匿名函數中,properties[i]的值已經賦給了臨時變量t,之後閉包對於外部變量的引用完全由t這個媒介來完成,因此prop傳入以後並未發生任何屬性的更改。

2.

1
2
3
4
5
functiona (x) {
    returnx * 2;
}
vara;
console.log(a);

這段代碼中,其實var a並沒有任何影響,輸出的是a(x)這樣的方法簽名。

3.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
c = 999;
varc = 888;
console.log(this.c);//①
functionb (x, y, c) {
    c = 6;
    arguments[2] = 10;
    console.log(c);//②
    console.log(this.c);//③
     
    varc = 6;
    console.log(c);//④
    console.log(this.c);//⑤
}
b(1, 2, 3, 4);

這道題是比較變態的。

  • 第①處,this指的是window,在window下,c、this.c、var c在這裏指的是同一個東西,看透這一點就好辦了。打印的是888。
  • 第②處,方法體中,參數c和arguments[2]指的是同一個地址,所以把後者賦爲10的時候,打印的是10,不是6。
  • 第③處,this指的是window,打印的是888。
  • 第④處,打印的是6。
  • 第⑤處,打印的是888。

4.

1
2
3
4
5
6
7
8
9
varstart = newDate();
setTimeout(
    function(){
        varend = newDate();
        console.log(end - start);
    },
    1000
);
while(newDate() - start < 2000);

JavaScript因爲是單線程工作的,因此雖然回調函數設置了1000毫秒後執行,事實上在1000毫秒的時候根本得不到執行,等待到while循環執行完畢後(因此已經是2000毫秒以後了),纔去執行,因此輸出應該是一個大於2000的數字。

5.

1
2
3
(function(){
    console.log(typeofarguments);
})();

很多人會說打印的是array,其實,typeof根本不會打印array的啊,打印的是object。

6.

1
2
functiona(){returna;}
console.log(newa() instanceofa);

應該打印的是false,其實原因很簡單,new a()的時候,因爲return語句,得到的不是a的實例,而是a本身,a instanceof a當然是false啦。

最後,還有一個小題目是關於Function Invocation Pattern的,我在這篇文章裏有寫到,就不單獨貼出來了。

文章系本人原創,轉載請保持完整性並註明出自《四火的嘮叨》

文章轉自:http://www.raychase.net/1485

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章