2013-07-29 218 views
2

我正在使用angularjs和phonegap,並且發現了這個代碼,我「知道」它做了什麼,但我不知道它是如何工作的。我仍然對先進的js概念感到滿意,所以如果你可以有一點描述性,我可以真的很感激它。javascript函數回調

問題:

  1. 在回調註冊,我沒有看到以下變量的任意位置設置:參數(5號線)和FN(10號線)。它們是在函數原型中聲明的嗎?

  2. 第9行和第15行的代碼塊是否設置了「this」值,以便在回調中「this」值指向相同的對象?我們稱之爲應用「這個」值的技巧是什麼?

 

    myApp.factory('phonegapReady', function() { 
     return function (fn) { 
      var queue = []; 
      var impl = function() { 
       queue.push(Array.prototype.slice.call(arguments));  
      }; 

      document.addEventListener('deviceready', function() { 
       queue.forEach(function (args) { 
        fn.apply(this, args); 
       }); 
       impl = fn; 
      }, false); 

      return function() { 
       return impl.apply(this, arguments); 
      }; 
     }; 
    }); 

 

回答

4

arguments是一個變量,它總是可用一個函數內部,並且是包含傳遞給函數的所有參數的數組狀物體。使用Array.prototype.slice.call的原因是因爲arguments不是一個完全的數組(它的對象具有序列數字鍵0,1等),並且該代碼是將其轉換爲真正的JavaScript數組的一種方式。

fn是一個傳入函數的第2行的參數,由於closures(內函數可以訪問其外函數的所有變量,即使在外函數之後也可用於第10行和第12行的內函數回報)。

至於apply電話與this去,你是正確的,因爲它設置了什麼對象的函數被調用上,從而this將涉及到什麼對象的函數中。

但是,重要的是要注意this的值是動態的,並且在函數執行時確定,而不是在聲明時確定。例如,在forEach循環中,this引用全局對象(可能是預期的),而不是觸發事件的對象。在最後一行中,this的值將取決於如何調用整個phonegapReady回調的結果。