閉包、定時器

1.什么是閉包? 有什么作用
  • 一個函數,能夠訪問另一個函數作用域中的變量。
  • 作用:一、使變量保存在內存中,不被回收。二、可以讀取內部變量。

閉包就是能夠讀取其他函數內部變量的函數。由于在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。
使用閉包的注意點::由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。

2.setTimeout 0 有什么作用

把該語句放到最后,等其他語句執行完畢后立即執行 setTimeout 0 語句。0為延遲時間。

Paste_Image.png
3.下面的代碼輸出多少?修改代碼讓fnArr() 輸出 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(n){
      return function (){
          return n;
      }
  })(i);
}
console.log( fnArr[3]() );  //

方法二:

var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =  (function(){
            var n = i;
            return function(){
              return n;
            }
        })();
    }
    console.log( fnArr[3]() );  //

方法三:

//方法3
   var fnArr = [];
       for (var i = 0; i < 10; i ++) {
         (function(){
           var n = i;
           fnArr[i] =  function(){
               return n;
           }    
         })();
       }
       console.log( fnArr[3]() );  //
4.使用閉包封裝一個汽車對象,可以通過如下方式獲取汽車狀態
var Car = (function(){
          var speed = 0;
          function setSpeed(n){
             speed = n;
          }
          function getSpeed(){
            return speed;
          }
          function accelerate(){
            speed += 10;
          }
          function decelerate(){
            speed -= 10;
          }
          function getStatus(){
            if(speed === 0){
              return 'stop';
            }else{
              return 'running';
            }
          }
          return {
            'setSpeed':setSpeed,
            'getSpeed':getSpeed,
            'accelerate':accelerate,
            'decelerate':decelerate,
            'getStatus':getStatus,
            'speed':'error'
          }
        }());
        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
5.寫一個函數使用setTimeout模擬setInterval的功能
        var i = 0;
        function a(){
          setTimeout (function(){
            console.log(i++);
            a()
          },3000)
        }
setTimeout:指定時間后執行一次
setInterval:每間隔時間重復執行
6.寫一個函數,計算setTimeout平均[備注:新加]最小時間粒度
function getMin(){
          var i = 0;
          var start = Date.now();
          var clock = setTimeout (function(){
            i++;
            if(i===1000){
              clearTimeout(clock);
              var end = Date.now();
              console.log((end - start)/i);
            }
            clock = setTimeout(arguments.callee,0);
          },0);
        }
7.下面這段代碼輸出結果是? 為什么?
var a = 1;
        setTimeout(function(){
            a = 2;
            console.log(a);//2
        }, 0);
        var a ;
        console.log(a);//1
        a = 3;
        console.log(a);//3
        原因是setTimeout()優先級放在最后所以結果是1,3,2。
8.下面這段代碼輸出結果是? 為什么?
var flag = true;
        setTimeout(function(){
          flag = false;
        },0)
        while(flag){}
        console.log(flag);

沒有輸出。因為setTimeout是在執行完其他代碼之后再執行,所以在執行完第一句之后,就到了下面的while循環,flag為true,為死循環,執行空語句,無輸出。

9.下面這段代碼輸出?如何輸出delayer: 0, delayer:1...(使用閉包來實現)
for(var i=0;i<5;i++){
      setTimeout(function(){
           console.log('delayer:' + i );
      }, 0);
      console.log(i);
  }

方法一:

for(var i=0;i<5;i++){
          (function(){
            var n = i;
            setTimeout(function(){
                 console.log('delayer:' + n );
            }, 0);
          })()
          console.log(i);
        }

方法二:

Paste_Image.png

方法三:

for(var i=0;i<5;i++){
      setTimeout((function(i){
        return function() {
          return console.log('delayer:' + i );
        }
      }(i)), 0);
      console.log(i);
  }

方法四:

for(var i=0;i<5;i++){
      setTimeout((function(){
          var n = i;
          return function () {
            return console.log('delayer:' + n );
          }
           
      }()), 0);
      console.log(i);
  }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1.什么是閉包? 有什么作用 定義:閉包就是嵌套在函數里面的內部函數,并且該內部函數可以訪問外部函數中聲明的所有局...
    饑人谷區子銘閱讀 984評論 0 2
  • 問題 一、什么是閉包? 有什么作用? 1.什么是閉包①JavaScript高級程序設計第三版定義閉包是指有權訪問另...
    鴻鵠飛天閱讀 476評論 0 0
  • 問題 一、什么是閉包? 有什么作用? 閉包閉包就是能夠讀取其他函數內部變量的函數。在javascript中,只有函...
    婷樓沐熙閱讀 601評論 0 0
  • 一、什么是閉包? 有什么作用 1.變量的作用域??要理解閉包,首先必須理解JavaScript的變量作用域。變量的...
    咩咩咩1024閱讀 769評論 1 1
  • 本教程版權歸小圓和饑人谷所有,轉載須說明來源 問題 什么是閉包? 有什么作用閉包(closure)是指有權訪問另一...
    饑人谷__小圓閱讀 503評論 0 0