2016-05-19 11 views
1

Я пытался решить https://twitter.com/secoif/status/730207047892017153, когда получил сообщение об ошибке, которого я не понимаю. Я получаю сообщение об ошибке при выполнении этого кодаНевозможно сопоставить привязку по массиву

const fns = [ 
    function() { 
    console.log(1) 
    }, 
    function() { 
    console.log(2) 
    }, 
    function() { 
    console.log(3) 
    } 
] 

fns.map(Function.prototype.call.bind) 

Chrome говорит мне «Bind должен вызываться на функцию», которую я не понимаю. Следующая строка, которая должна быть эквивалентной, не вызывает такую ​​же ошибку.

fns.map((x) => Function.prototype.call.bind(x)) 
+1

[Как передать метод, определенный на прототипе, в Array.map как обратный вызов) (http://stackoverflow.com/questions/33006222/how-to-pass-the-method-defined-on-prototype-to -array-map-as-callback) – Tushar

+0

@Tushar интересно, но если причина в том, что карта передает два аргумента, я не вижу, почему 'fns.map ((x, y) => Function.prototype.call.bind (x, y)) 'будет работать – xuanji

+1

' bind' не привязан к 'call'. Вместо этого вы должны использовать 'fns.map (Function.prototype.bind, Function.prototype.call)' (или 'fns.map (Function.prototype.bind.bind (Function.prototype.call))', если вы предпочитают это) – Bergi

ответ

0

Для решения викторину JS, вы можете сделать это:

for (var x in fns) fns[x](); 

Однако, я понимаю, что это не то, что вы просите :).

Есть несколько вещей, которые я не понимаю, в вашем подходе:

1) Почему вы используете .map()? Карта используется для возврата другого массива, который не нужен, поэтому почему вместо forEach() вместо этого?

2) Я не уверен, почему вы используете bind. При использовании map() обратный вызов передается 3 параметрам: текущая функция, индекс функции в массиве и сам массив. Когда вы смотрите на синтаксис для bind(), вы заметите, что первым параметром для bind является объект this, а затем параметры, которые должны передаваться в связанной функции. В этом случае «this» будет установлен на текущую функцию, индекс и массив будут переданы в качестве параметров функции.

3) Использование привязки по вызову. call() примет те же параметры bind(), где первый - это «это», а остальные - параметры, которые должны быть переданы в вызываемую функцию. Когда вы используете .bind(), он будет устанавливать этот объект как функцию, а первым параметром будет индекс. Итак, с точки зрения .call() вы устанавливаете «это» в функцию и передаете индекс в качестве первого параметра для вызова(), который является «этим», который затем передает весь массив как первый параметр для функции.

Короче говоря, вы все смешаете свои ценности, и ваше чрезмерное это.

0

из документации mdn docs for map

thisArg факультативным. Значение, которое необходимо использовать при выполнении обратного вызова. Значение по умолчанию является объект окна

Как отмечено ранее, вы можете карте:

fns.map(Function.prototype.call.bind, Function.prototype.call.bind) 

Если вы звоните по телефону:

fns.map(Function.prototype.call.bind) 

Bind Нанести на объект не функционирует! и ошибка поднята, потому что объект не имеет метода привязки.

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