8

我在javascript中有一个函数

function foo(callback) {
    console.log("Hello");
    callback();
}

和另一个功能

function bar() {
  console.log("world");
}

我想做一个函数FooBar

FooBar = foo.bind(this, bar);

这很好用,但是我实际上要做的是创建一个函数 queue,并且通常我必须在绑定回调之前绑定一个无函数参数,如下例所示

function foo() {
    console.log(arguments[0]);
    var func = arguments[1];
    func();
}

function bar() {
    console.log("world");
}

foo.bind(this, "hello");
var FooBar = foo.bind(this, bar);

FooBar();

产生此错误

[Function: bar]

TypeError: undefined is not a function

一个函数绑定到其他非函数类型后,如何将它绑定到另一个函数?

4

2 回答 2

7

你绑定"Hello"foo,然后单独绑定barfoo- 你不应该绑定bar到 first 的结果bind,像这样:

var FooHello = foo.bind(this, "hello");
var FooBar = FooHello.bind(this, bar);

在这里拉小提琴。(记录“Hello”、“world”)。

于 2013-06-16T20:34:41.843 回答
4

bind 方法不会将函数相互绑定,它的目的是在调用函数时修复 'this' 关键字和任何参数的上下文。然后它返回一个新函数,保持原来的不变。

所以:foo.bind(this, "hello")实际上没有效果。第二次调用 bind 会创建一个带有固定参数的新函数bar。你得到一个错误的原因是因为只传递了一个参数,arguments[1]是未定义的。

您可以按照 Richie 的建议进行操作并添加一个中间变量,或者只是在一个绑定中传递两个参数:

var FooBar = foo.bind(this, "hello", bar);

还包括运行时检查可能是一个好主意,这样您的函数就可以检测到它何时处理函数。这将使您不必担心参数顺序。

if(typeof func === 'function'){
  func();
}
于 2013-06-16T21:04:31.400 回答