2015-02-12 70 views
1

下面的函數下劃線功能是由我的同伴改寫像這樣:func.apply(this,arguments)在這段代碼中爲_.once()做了什麼?

var once = function(func) { 
     var alreadyCalled = false; 
     var result; 

     return function() { 
      if (!alreadyCalled) { 
      result = func.apply(this, arguments); 
      alreadyCalled = true; 
      } 
     return result 
     }; 
     }; 

這裏是我如何解釋它。這是一個接受另一個函數並返回另一個函數的函數。如果alreadyCalledfalse然後設置result = func.apply(this,arguments)

是否有人可以幫助我在一個簡單的方法是什麼func.apply(this,arguments)在此功能的情況下做明白。我似乎無法弄清楚!

+0

將'this'存儲在變量以前的返回函數中... – 2015-02-12 04:59:06

+2

[MDN應用](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply) – epascarello 2015-02-12 04:59:53

回答

2

每個函數都有兩個隱式參數:thisarguments

Function對象上的apply方法允許您使用明確設置的參數調用它。

所以這裏會發生什麼是你得到一個函數包裝另一個函數,當你調用它時,它將傳遞給原始參數。它也會跟蹤它是否被調用及其結果。

+0

這是怎麼來的?var once = function(func)var result = func.apply(this,arguments); 返回結果; }; addTwo = function(x){return x + 2}; once(addTwo(2));'返回TypeError:func.apply不是函數 – theamateurdataanalyst 2015-02-12 05:29:00

+0

您需要像這樣調用它'once(addTwo)(2)',否則您不會將函數傳遞給'once'你會傳遞'4' – Equiso 2015-02-12 05:30:14

+0

甚至更​​好的保存一個變量的新函數的引用 'var addTwoOnce = once(addTwo)'然後'addTwoOnce(2)' – Equiso 2015-02-12 05:34:21