我得到我的头包裹钻营和使用其他技术Function.prototype.bind
。
这似乎是非常有用的,改变功能范围(即, this
在某些情况下的值)。
但是它看起来就像你不能用改变范围bind
,一旦你已经这样做了:
function f = obj.method.bind(42);
function g = obj.method.bind('Hi');
function f2 = f.bind('Hi'); // “this” is still 42
是否有可能恢复从约束功能在所有的原始绑定功能?
什么是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
),一个将与你的函数将被真正执行的范围内。
我想说明这将是有益的Win32的回答与图片。
通过生成一个包装bind
可以确保你的函数调用给定的上下文不管 。
这样的包装总是会忽略自己的上下文 。
由于包装的链条,任何情况下,但最里面的丢失。
因此,有没有办法改变的背景下,一旦它已经使用设置bind
。
这实际上解决您发出
const bind = Function.prototype.bind;
Object.defineProperty(Function.prototype, 'bind', {
value: function () {
const result = bind.apply(this, arguments);
result.source = this;
return result;
}
});
现在,你可以得到source
属性来获取原始功能。 这可能会导致其他问题,但性能似乎并没有成为他们中的一个, https://jsperf.com/bind-override/1
这两个IE,边缘,Firefox和Chrome似乎得到相同的结果,有时正常的版本速度更快,有时重写速度更快。