Почему вызов setTimeout со скобками не запускает новый столбец?
Следующий код имеет новый стек вызовов, когда отладчик пожаров в D (jsfiddle здесь)
function c() {
setTimeout( d, 1000 );
}
function d() {
debugger;
}
c();
Если мы модифицируем код для использования setTimeout( d(), 1000 );
, у которого есть скобки (скобки:)
function c() {
setTimeout( d(), 1000 );
}
function d() {
debugger;
}
c();
то CallStack имеет как с (в) и г() (jsfiddle здесь). Почему?
Ответы
Ответ 1
Вы не передаете setTimeout
функцию d
во втором примере; вместо этого вы передаете d()
, что является результатом вызова d
.
Результат вызова d
равен undefined
, поскольку он ничего не возвращает, который преобразуется в строку "undefined"
, которая затем eval
ed, делает... точно ничего.
Что касается вызовов, так как вы вызываете d
внутри c
, вот почему вы видите c
в стоп-кадре. Чтобы уточнить, ваш второй пример такой же, как
function c() {
var temp = d();
setTimeout(temp, 1000);
}
function d() {
debugger;
}
c();
Ответ 2
SetTimeout принимает аргумент функции. Если вы передаете строку, она действует как eval. Если вы вызываете функцию, как и вы, она срабатывает немедленно, после чего setTimeout запускается с результатами в новом стеке вызовов.
Ответ 3
Потому что в первом примере вы передаете указатель на функцию как вещь, которую нужно выполнить за 1 секунду. Во втором примере вы уже выполнили d, и вы передаете результаты d() в setTimeout для вызова через 1 секунду.