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