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