gpt4 book ai didi

Javascript - 使用 apply 调用绑定(bind)函数

转载 作者:行者123 更新时间:2023-11-29 10:20:28 27 4
gpt4 key购买 nike

假设我们有以下示例 Javascript 代码:

var modeller = "foo";
var provider1 = function (modeller, content, optionalArg) {
alert("this: " + this + ", content: " + content + ", optionalArg: " + optionalArg);
}.bind(null, modeller);

var provider2 = function (content, optionalArg) {
alert("this: " + this + ", content: " + content + ", optionalArg: " + optionalArg);
};

var createConsumer = function () {
// some arbitrary private vars
var content = 1;
var option = 2;

var doConsume = function(provider) {
provider.apply(this, [content, option])
};
return {consume: doConsume};
};

// Now use them
var consumer = createConsumer();

consumer.consume(provider1);
consumer.consume(provider2);

出于演示目的,这已简化很多,但要点是 provider1 已绑定(bind),而 provider2 未绑定(bind) - 消费者无法将自身作为 this provider1 的参数。

问题:有没有办法检测这种函数已经绑定(bind)的情况?有没有办法让 provider1 将消费者用作 this?假设答案是否定的,解决这种情况的最佳方法是什么?

最佳答案

"Is there a way to detect this kind of case where a function is already bound?"

没有。

"Is there a way to get provider1 to use the consumer as this?"

没有。

"...what is the best way to work around this sort of situation?"

因为看起来你想绑定(bind)一个参数而不是 this 值,我会在 Function.prototype 上创建一个参数绑定(bind)器方法,它返回一个只包含参数绑定(bind),而不是 this

Function.prototype.argBind = function() {
var _slicer = [].slice,
orig_args = _slicer.call(arguments),
orig_func = this;
return function() {
return orig_func.apply(this, orig_args.concat(_slicer.call(arguments)));
};
};

然后你会像这样使用它:

var modeller = "foo";
var provider1 = function (modeller, content, optionalArg) {
alert("this: " + this + ", content: " + content + ", optionalArg: " + optionalArg);
}.argBind(modeller);

现在 provider1 函数将使用任何正常的 this 值被调用,但是 modeller 将被绑定(bind)为第一个参数。

关于Javascript - 使用 apply 调用绑定(bind)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13258365/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com