Почему вызов 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 секунду.

Другие вопросы по тегам