間違えやすいJavaScriptの問題

2230 ワード

1、
function Container( properties ) {
    var objthis = this;
    for ( var i in properties ) {
        (function(){
                var t = properties[i];
                objthis[ "get" + i ] = function() {return t;};
                objthis[ "set" + i ] = function(val) {t = val;};
        })();
    }
}
 
var prop = {Name : "Jim", Age : 13};
var con = new Container(prop);
console.log(con.getName());
 
con.setName("Lucy");
console.log(con.getName());
console.log(prop.Name);
 
このコードは何を出力しますか?前の二行はそれぞれ「Jim」と「Lucy」です.これは大丈夫です.しかし、3行目の出力は「Jim」ですが、プロのオブジェクトが修正されたと勘違いして「Lucy」を出力します.実際には匿名関数では、プロperties[i]の値が一時変数tに割り当てられています.その後、閉ループが外部変数に対する参照は完全にtというメディアによって行われています.したがって、プロプが入ってきてからは、いかなる属性の変更も発生していません.
 
2、 
function a (x) {
    return x * 2;
}
var a;
console.log(a);
 
このコードの中で、実はvar aは何の影響もありません.出力はa(x)という方法で署名されています.
 
3、 
c = 999;
var c = 888;
console.log(this.c); //①
function b (x, y, c) {
    c = 6;
    arguments[2] = 10;
    console.log(c); //②
    console.log(this.c); //③
     
    var c = 6;
    console.log(c); //④
    console.log(this.c); //⑤
}
b(1, 2, 3, 4);
 
この問題は比較的変態です.
第①所、thisとはwindowのことで、windowの下で、c、this.c、var cはここで同じものを指しています.この点を見通すと簡単です.印刷は888です第②において、メソッド体では、パラメータcとargments[2]は同じアドレスを指していますので、後者を10に賦課する場合は、印刷は10であり、6ではありません.③のところ、thisとはwindowを指し、印刷されたのは888です.④では、印刷は6である.⑤で印刷されたのは888です.4、
var start = new Date();
setTimeout(
    function(){
        var end = new Date();
        console.log(end - start);
    },
    1000
);
while(new Date() - start < 2000);
 
 
JavaScriptはシングルスレッドで動作していますので、コールバック関数は1000ミリ秒を設定して実行しますが、実際には1000ミリ秒では実行できません.whileサイクルが完了するまで待っています.出力は2000ミリ秒以上の数字です.
 
5、 
(function(){
    console.log(typeof arguments);
})();
 
多くの人がプリントしたのはarrayと言いますが、実は、argmentsは配列ではなくて、印刷したのはobjectです.
 
6、
function a(){return a;}
console.log(new a() instanceof a);
 
印刷するべきなのはfalseで、実は原因はとても簡単で、new a()の時、return文のため、得たのはaの実例ではありませんて、a自身で、a instanceaはもちろんfalseです.
最後にもう一つの小さなテーマがあります.Function Invocation Patternについては、この文章に書いてあります.単独では貼りません.