2016-02-06 5 views
1

The closest I've seen is this, but it doesn't really help me since I need to bind some parameters for later use with setInterval.Javascript: аргумент распаковывается в function.prototype.bind()?

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

[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()?

+1

Кажется, я ответил на такой вопрос, прежде чем: P –

ответ

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)) 
2

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

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 

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

+0

мне очень нравится это. Очень элегантно - приятно! –

+0

Вопрос: так как я думаю, что нашел решение без итерации, будет ли это работать, а если нет, то почему ?: 'Function.prototype.bindArray (thisArg, array) {' 'array.unshift (thisArg); ' ' return this.bind.apply (this, array); ' '} ' – 13steinj

+0

Это кажется слишком сложным (для задачи) и создает ненужные объекты промежуточной функции. –

 Смежные вопросы

  • Нет связанных вопросов^_^