Function.prototype.bind = function() {
var $this = arguments[0];
return this.apply($this, Array.prototype.slice.call(arguments, 1));
};
在现实世界的应用程序中使用它是否足够好?
答案 0 :(得分:4)
没有。关于这段代码我有一些不喜欢的东西,以及为什么它不起作用的一些原因。
首先,大多数人不会这样分配参数。它占用了额外的空间,没有额外的效果。如果变量名称应根据参数数量/参数类型而改变,则仅使用arguments变量。要指定$this
,你应该做..
Function.prototype.bind = function($this) {
其次,bind应该返回一个函数。你的回报是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;
};
}