привязка функции к другой функции в javascript

у меня есть функция в JavaScript

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

и еще одна функция

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

и я хочу, чтобы функция FooBar

FooBar = foo.bind(this, bar);

это отлично работает, однако то, что я на самом деле пытаюсь сделать, это создать очередь функция, и часто мне придется связывать параметр функции none перед привязкой обратного вызова, как в следующем примере

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

как я могу связать функция к другой функции, как только она была привязана к другим типам функций none?

2 ответов


вы связываете "Hello" to foo, а затем отдельно обязывающего bar to foo а также-вы не должны связывать bar к результату первого bind, например:

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

скрипка здесь. (который регистрирует "Привет", "мир").


метод bind не связывает функции друг с другом, его целью является исправление контекста ключевого слова "this" и любых аргументов при вызове функции. Затем он возвращает новую функцию, оставляя оригинал без изменений.

так: foo.bind(this, "hello")на самом деле не имеет никакого эффекта. Вызов bind во второй раз создает новую функцию с фиксированным аргументом bar. Причина, по которой вы получаете ошибку, заключается в том, что передан только один аргумент,arguments[1] неопределено.

вы смогли сделать как Ричи предлагает добавить промежуточную переменную или просто передать оба аргумента в одной привязке:

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

вероятно, неплохо также включить проверку времени выполнения, чтобы ваша функция могла обнаружить, когда она имеет дело с функцией. Это избавит вас от необходимости беспокоиться о порядке аргумента.

if(typeof func === 'function'){
  func();
}