JavaScript函数指针,将参数作为函数参数传递

18

不确定标题是否表达正确,或者是否有更好的方式来表达,但我认为它还可以。

无论如何,目前我了解到以下内容:

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();
即使"fourth"中有一个参数,我似乎也找不到解决这个问题的方法,有什么建议吗?
谢谢!
2个回答

28

使用匿名函数来包装您的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);

这非常有帮助,确实解决了问题。谢谢!(一旦SO允许我,我会接受你的答案...6分钟:() - Jordan Johns

1

使用BIND功能非常容易

a.b("a", "b", "c", foo.bind(undefined, "bar"));

因此,当您在函数内调用foo()时,它已经具有了第一个绑定的参数。您可以使用bind添加任意数量的参数。

请注意,bind始终将参数应用于函数并将其放置在第一位。如果您想要应用于该对象并使用this,请注意:

    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'));

请参考示例http://jsfiddle.net/zafod/YxBf9/2/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接