обратные вызовы содержат ссылку на функцию.

уйста, игнорируйте тот факт, что этот код ничего не дает и приносит извинения за то, что, вероятно, глупый вопрос!

Я понимаю, что не могу передать вызов функции вsetTimeout() в качестве первого аргумента, ноЗачем я не могу этого сделать?

let names = ['Andy', 'Ross', 'David'];

function printer (name) {
 console.log(name);
}

names.forEach(name => setTimeout(printer(name), 1000);

Результат:

Andy
timers.js:327
    throw new TypeError('"callback" argument must be a function');
    ^

Я могу решить проблему, используя вместо этого ссылку наprinter и используяbind() отправлятьname наряду с этим, но почему я должен предпринять эти дополнительные шаги?

let names = ['Andy', 'Ross', 'David'];

function printer (name) {
  console.log(name);
}

names.forEach(name => setTimeout(printer.bind(null, name), 1000));

Результат:

Andy
Ross
David
 Ruben Karapetyan10 апр. 2017 г., 09:34
потому что setTimeout должен получить обратный вызов, который должен быть вызван позже

Ответы на вопрос(5)

Вы можете сделать это так:

setTimeout(printer, 1000, name)

Вы можете попробовать это:

setTimeout(function(){printer(name)}, 1000)

meout, функция будет выполнена немедленно, то есть функция будет немедленно помещена в стек выполнения javascript.

Если вы передаете имя функции, то есть ссылку на функцию, функция помещается в стек выполнения потока JavaScript только после завершения таймера.

 NoobOfNoobs11 апр. 2017 г., 10:49
Спасибо, это имеет смысл! я ценю его

setTimeout должен принять функцию в качестве первого аргумента.

Пожалуйста, обратитесь:

https://www.w3schools.com/jsref/met_win_settimeout.asp

Здесь вы передаете результат функции в качестве первого аргумента, которыйundefined.

Правильный способ передачи ссылки на функцию - использовать обратные вызовы.

names.forEach(name => setTimeout(function() {
    printer(name);
}, 1000));

обратные вызовы содержат ссылку на функцию.

setTimeout(callbackFunction, milliseconds);

Ваш ответ на вопрос