我可以从一个JavaScript绑定功能获得一个绑定的功能?

问题描述 投票:22回答:3

我得到我的头包裹钻营和使用Function.prototype.bind其他技术。 这似乎是非常有用的在某些情况下改变功能范围(即,this值)。

然而it looks like you can't change the scope with bind一旦你已经这样做了:

function f = obj.method.bind(42); 
function g = obj.method.bind('Hi');

function f2 = f.bind('Hi'); // “this” is still 42

是否有可能恢复从约束功能在所有的原始绑定功能?

javascript function bind ecmascript-5
3个回答
26
投票

什么bind方法基本上做的是一样的东西(不完全的,因为参数被切片,以排除上下文):

function bind(context) {
    var self = this;
    return function() {
        self.apply(context, arguments);
    }
}

所以基本上它返回另一个函数,它将调用自身与给定的上下文和参数。如果再次bind它,你会结合这个新创建的功能,这将是仿佛bind是等来实现:

 function bind(context) {
    var self = this;
    return function() {
        self.apply(context, arguments);
    }.bind(otherContext);
}

但由于通过绑定返回的内部函数作为一个封闭的地方原来上下文是一个第一(self)绑定,一个将与你的函数将被真正执行的范围内。


25
投票

我想说明Win32's answer用图片将是有益的。

通过bind生成的包装可以确保你的函数调用给定的上下文不管。 这样的包装总是会忽略自己的上下文。

由于包装的链条,任何情况下,但最里面的丢失。 因此,有没有办法改变的背景下,一旦它已经使用bind设置。


0
投票

这实际上解决您发出

const bind = Function.prototype.bind;
Object.defineProperty(Function.prototype, 'bind', {
    value: function () {
        const result = bind.apply(this, arguments);
        result.source = (this.source || this);
        return result;
    }
});

现在,你可以得到source属性来获取原始功能。这可能会导致其他问题,但性能似乎并没有成为他们中的一个,https://jsperf.com/bind-override/1

这两个IE,边缘,Firefox和Chrome似乎得到相同的结果,有时正常的版本速度更快,有时重写速度更快。

© www.soinside.com 2019 - 2024. All rights reserved.