Javascript: распаковка аргумента в function.prototype.bind()?

Самое близкое, что я видел, это это, но мне это не очень помогает, так как мне нужно привязать некоторые параметры для последующего использования с setInterval.

Более конкретно:

[in] var d = function(l, m) {
       console.log(l);
       console.log(m);
     }
[in] d.apply(window, [1,2])
[out] 1
[out] 2
[out-return-value] undefined
[in] d.bind(window, [1,2])()
[out] [1, 2]
[out] undefined
[out-return-value] undefined

Как видно, массивы распаковываются с помощью .apply(), но не с помощью .bind(). Есть ли способ распаковать аргументы с помощью .bind()?


person 13steinj    schedule 06.02.2016    source источник
comment
Кажется, я ответил на такой вопрос раньше: P   -  person Felix Kling    schedule 06.02.2016


Ответы (2)


.bind — это просто еще одна функция. Вызовите его с помощью .apply, если вы хотите вызвать его с массивом аргументов:

var bound = d.bind.apply(d, [window, 1, 2]);
// If the `this` value is known, but the arguments is an array, concat:
// var bound = d.bind.apply(d, [window].concat(args))
person Community    schedule 06.02.2016

Попробуй это.

Function.prototype.bindArray(ctx, array) {
  if (array && array.length && array.pop && array.length > 0) {
    var v = array.pop();
    return this.bindArray(ctx, array).bind(ctx, v);
  }
  else return this;
};

Он будет итеративно связывать каждое значение в array.

Используйте это как:

var d = function(l, m) {
  console.log(l);
  console.log(m);
};
var c = d.bindArray(null, [1,2]);
c(); // 1 2

Также смотрите ниже ответ @felix. Это даже круто.

person Quarter2Twelve    schedule 06.02.2016
comment
Мне действительно это нравится. Очень элегантно - красиво! - person Matthew Herbst; 06.02.2016
comment
Вопрос: поскольку я думаю, что нашел решение без итерации, будет ли это работать, а если нет, то почему?: ` Function.prototype.bindArray(thisArg, array) {` ` array.unshift(thisArg);` ` return this .bind.apply(это, массив);` ` }` - person 13steinj; 06.02.2016
comment
Это кажется слишком сложным (для задачи) и создает ненужные промежуточные функциональные объекты. - person Felix Kling; 06.02.2016
comment
@ 13steinj да, это работает. Этот ответ на самом деле классный. - person Quarter2Twelve; 06.02.2016