Function.prototype.bind = function() {
var $this = arguments[0];
return this.apply($this, Array.prototype.slice.call(arguments, 1));
};
在現實應用程序中使用它是否足夠好?這是一個很好的綁定方法嗎?
Function.prototype.bind = function() {
var $this = arguments[0];
return this.apply($this, Array.prototype.slice.call(arguments, 1));
};
在現實應用程序中使用它是否足夠好?這是一個很好的綁定方法嗎?
不。有幾件事我不喜歡這段代碼,以及爲什麼它不起作用的幾個原因。
首先,大多數人不會這樣指定參數。它佔用額外的空間,無需額外的效果。如果變量名稱應該根據參數數量/參數類型進行更改,則只能使用參數變量。要分配$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;
};
}
爲什麼不直接使用functionName.call(this,arguments)? – Matt 2011-05-26 17:24:11
我不知道........ – David 2011-05-26 17:25:23
我認爲一些庫有一個綁定函數,它允許你綁定一個函數的範圍,這個函數被調用* later *,比如事件回調。但是上面你正在執行它。你的意圖是什麼? – Matt 2011-05-26 17:29:14