这是一个很好的绑定方法吗?

时间:2011-05-26 17:21:32

标签: javascript

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

在现实世界的应用程序中使用它是否足够好?

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;
    };
}