16

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

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

a.b("a", "b", "c", foo);

其中“foo”是在别处定义的函数,不接受任何参数只会导致函数 ab() 运行,并带有上述参数。然后可以在函数 ab() 中简单地调用参数“foo”作为“foo()”。换句话说,我理解上述调用是使用函数指针作为函数 ab 中的参数作为参数。

好的,现在这就是我想要做的......

我希望能够做与上述类似的事情,除了这次我希望 foo 在该参数中传递一个参数,如下所示:

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

现在问题来了。这将导致使用参数“a”、“b”、“c”和foo(“bar”) 的结果。我不想要这个。我希望 foo("bar") 按字面意思传入,以便在函数 ab 中看起来像这样(作为标题):

a.b(first, second, third, fourth);

可以引用并调用第四个参数:

fourth();

即使“第四”有一个论点。我似乎无法找到解决这个问题的方法,有什么建议吗?

谢谢!

4

2 回答 2

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);
于 2012-11-30T03:38:09.560 回答
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'));

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

于 2012-11-30T04:18:20.353 回答