level-20

3650 ワード

閉包とは何ですか何の効果がありますか
簡単に言えば、クローズドとは、他の作用領域の変数にアクセスできる関数を作成します.関数の内部と関数の外部をつなぐ橋に相当します.閉塞の役割:
  • は、パッケージ化を実現し、クローズドにより、外部環境で関数内部の変数にアクセスすることができる.
  • set Timeout 0はどんな役割がありますか?
    JavaScriptの非同期を実現するには、通常はJavaScriptは単一スレッドで実行されます.つまり、複数のコードを同時に実行することはできません.あるコードが実行されている時には、後続のタスクはすべて待ち行列を形成し、現在のタスクが実行されたら、次のタスクをキューから取り出します.これはしばしば「閉塞式執行」と呼ばれる.setTimeout 0を使用すると、修飾文のロード順序が変更されます.例えば
    console.log(1);
    setTimeout("console.log(2)",0);
    console.log(3);
    //        1,3,2
    
    下のコードの出力はどれぐらいですか?コードを修正してfnAriにiを出力させる.二つ以上の方法を使う.
        var fnArr = [];
        for (var i = 0; i < 10; i ++) {
            fnArr[i] =  function(){
                return i;
            };
        }
        console.log( fnArr[3]() );
        //           
         var fnArr = [];
        for (var i = 0; i < 10; i ++) {
            fnArr[i] =  function(){
                var b=i;
                return function(){
                    return b;
                }
            }(i);
        }
        console.log( fnArr[3]() );
        //         。
            var fnArr = [];
        for (var i = 0; i < 10; i ++) {
            fnArr[i] =  function arr(){
                return arr.fn;
            };
            fnArr[i].fn=i;
        }
        console.log( fnArr[3]() );
    
    クローズドパッケージを使って車の対象を一つ包装し、次のように車の状態を取得することができます.
    var Car = function (){
        var speed;
    
        function setSpeed(num){
            speed=num;
        }
    
        function getSpeed(){
            console.log(speed);
            return speed;
        }
    
        function accelerate(){
            speed+=10;
        }
    
        function decelerate(){
            speed-=10;
        }
    
        function getStatus(){
            if(speed==0){
                console.log("stop");
            }
            else{
                console.log("running");
            }
        }
        return{
            speed:speed,
            setSpeed:setSpeed,
            getSpeed:getSpeed,
            accelerate:accelerate,
            decelerate:decelerate,
            getStatus:getStatus,
        }
    }();
    Car.setSpeed(30);
    Car.getSpeed(); //30
    Car.accelerate();
    Car.getSpeed(); //40;
    Car.decelerate();
    Car.decelerate();
    Car.getSpeed(); //20
    Car.getStatus(); // 'running';
    Car.decelerate(); 
    Car.decelerate();
    Car.getStatus();  //'stop';
    // Car.speed;  //error
    
    3.次の関数を書くsetTimeoutアナログsetIntervalの機能を使う
    function add(){
        var time=new Date();
        console.log("     "+time.getHours()+" "+time.getMinutes()+" "+time.getSeconds()+" ");
        add();
    }
            setTimeout("add()",1000);
        // setInterval("add()",1000);
    
    関数を書いて、setTimeoutの最小時間粒度を計算します.
    function getTime(){
        var start=new Date();
        var a=0;
        var click=setTimeout(function(){
            a++;
            if(a==1000){
                clearTimeout(click);
                var end=new Date();
                time=((end-start)/1000);
                console.log(time);
            }
           click= setTimeout(arguments.callee, 0);
        },0)
    }
    getTime();//4.06
    
    このコードの出力結果は?なぜですか
    var a = 1;
    setTimeout(function(){
        a = 2;
        console.log(a);//2
    }, 0);
    var a ;
    console.log(a);//1
    a = 3;
    console.log(a);//3
    //    1、3、2;
    //  setTimeot 0   ,  function(){}       。
    
    このコードの出力結果は?なぜですか
    var flag = true;
    setTimeout(function(){
        flag = false;
    },0)
    while(flag){}
    console.log(flag);
    //     while     。      。
    //  setTimeout 0    ,    function(){},          ,   。
    // while(flag){}            ,    。    。
    
    このコードの出力は以下の通りですか?どのようにdelayer:0を出力しますか?delayer:1…
    for(var i=0;i<5;i++){
        (function(){
            var a=i;
            setTimeout(function(){
             console.log('delayer:' + a );
        }, 0);
        }())
       
        console.log(i);
    }