2011-05-26 60 views
1
Function.prototype.bind = function() { 
    var $this = arguments[0]; 
    return this.apply($this, Array.prototype.slice.call(arguments, 1)); 
}; 

在現實應用程序中使用它是否足夠好?這是一個很好的綁定方法嗎?

+0

爲什麼不直接使用functionName.call(this,arguments)? – Matt 2011-05-26 17:24:11

+0

我不知道........ – David 2011-05-26 17:25:23

+0

我認爲一些庫有一個綁定函數,它允許你綁定一個函數的範圍,這個函數被調用* later *,比如事件回調。但是上面你正在執行它。你的意圖是什麼? – Matt 2011-05-26 17:29:14

回答

4

不。有幾件事我不喜歡這段代碼,以及爲什麼它不起作用的幾個原因。

首先,大多數人不會這樣指定參數。它佔用額外的空間,無需額外的效果。如果變量名稱應該根據參數數量/參數類型進行更改,則只能使用參數變量。要分配$this你應該做的..

Function.prototype.bind = function($this) { 

其次,綁定應該返回的功能。你的回報this返回。您的功能更像是Function:call,然後是Function:bind

你需要做什麼來解決它,是讓它返回一個函數,當運行時將返回函數返回的任何東西。

試試這個:

Function.prototype.bind = function($this) { 
    // `this` changes inside the function, so we have to give it a safe name. 
    var self = this; 
    return function() { 
     return self.apply($this, Array.prototype.slice.call(arguments, 1)); 
    } 
}; 

而且,更現代的瀏覽器有這個功能內置的的ECMAScript 5標準的作用是用普通的JavaScript,因此對於老的瀏覽器,只是包含這個code suggested by Mozilla

if (!Function.prototype.bind) { 
    Function.prototype.bind = function(obj) { 
     var slice = [].slice, 
      args = slice.call(arguments, 1), 
      self = this, 
      nop = function() {}, 
      bound = function() { 
       return self.apply(this instanceof nop ? this : (obj || {}), args.concat(slice.call(arguments))); 
      }; 
     nop.prototype = self.prototype; 
     bound.prototype = new nop(); 
     return bound; 
    }; 
} 
+1

我認爲你需要在返回的函數中使用'return',否則實際調用的「真實」函數返回的值將會丟失。 – Pointy 2011-05-26 17:32:56

+0

謝謝。我總是忘記這一點。的xD – Kayla 2011-05-26 17:33:46

相關問題