Почему вызов setTimeout с круглыми скобками не запускает новый стек вызовов? - PullRequest
3 голосов
/ 09 ноября 2011

Следующий код имеет новый стек вызовов, когда отладчик запускается в 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 ]

9 голосов
/ 09 ноября 2011

Вы не передаете 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 голосов
/ 09 ноября 2011

SetTimeout принимает аргумент функции. Если вы передаете строку, она действует как eval. Если вы вызываете функцию, как вы это сделали, она запускается немедленно, а затем setTimeout запускается с результатами в новом стеке вызовов.

1 голос
/ 09 ноября 2011

Потому что в первом примере вы передаете указатель на функцию, выполняемую за 1 секунду.Во втором примере вы уже выполнили d и передаете результаты d () в setTimeout для вызова за 1 секунду.

...