不确定标题是否措辞正确,或者是否有更好的说法,但我认为没关系。
无论如何,到目前为止,我理解以下内容:
a.b("a", "b", "c", foo);
其中“foo”是在其他地方定义的函数,它不带参数,只会导致函数a.b()运行,并带有上述参数。然后可以在函数a.b()内调用参数“foo”,简单地称为“foo()”。换句话说,我理解上面的调用是使用函数指针作为函数a.b中的参数作为参数。
好的,现在这就是我要做的......
我希望能够做类似上面的事情,除非这次我希望foo在该参数中传递一个参数,如下所示:
a.b("a", "b", "c", foo("bar"));
现在问题就在于此。这将导致使用参数“a”,“b”,“c”和foo(“bar”)的结果。我不想要这个。我希望foo(“bar”)按字面顺序传入,以便在函数a.b中看起来像这样(作为标题):
a.b(first, second, third, fourth);
可以引用并调用第四个参数:
fourth();
即使“第四”中有一个参数。我似乎找不到解决这个问题的方法,有什么建议吗?
谢谢!
答案 0 :(得分:26)
使用匿名函数打包foo
电话。
a.b("a", "b", "c", function() {return foo("bar");});
如果您需要保留将给出的this
值,可以使用.call
调用它。您也可以传递给定的任何参数。
a.b("a", "b", "c", function(arg1, arg2) {return foo.call(this, "bar", arg1, arg2);});
当然,这个功能并不一定是匿名的。您也可以使用命名函数。
function bar(arg1, arg2) {
return foo.call(this, "bar", arg1, arg2);
}
a.b("a", "b", "c", bar);
答案 1 :(得分:1)
使用BIND功能
非常简单a.b("a", "b", "c", foo.bind(undefined, "bar"));
因此,当你在函数内部调用foo()
时,它已经有了第一个绑定参数。您可以使用bind
按照您的意愿申请更多论证。
请注意bind
总是将参数应用于函数并将它们放在第一位。如果你想申请并使用它:
if (!Function.prototype.bindBack) {
Function.prototype.bindBack = function (_super) {
if (typeof this !== "function")
throw new TypeError("Function.prototype.bindBack - can not by prototyped");
var additionalArgs = Array.prototype.slice.call(arguments, 1),
_this_super = this,
_notPrototyped = function () {},
_ref = function () {
return _this_super.apply((this instanceof _notPrototyped && _super) ? this : _super, (Array.prototype.slice.call(arguments)).concat(additionalArgs));
};
_notPrototyped.prototype = this.prototype;
_ref.prototype = new _notPrototyped();
return _ref;
}
}
function tracer(param1, param2, param3) {
console.log(arguments)
}
function starter(callback) {
callback('starter 01', 'starter 02')
}
// See here!!!
// function starter call 'calback' with just 2 params, to add 3+ params use function.bindBack(undefined, param, param, ...)
starter(tracer.bindBack(undefined, 'init value'));