У меня есть код Javascript.Понимание порядка выполнения Javascript
var i, _i, _len, _ref;
_ref = [1, 2, 3];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
i = _ref[_i];
setTimeout((function() {
return console.log(i);
}), 0);
}
Это генерируется частью Coffeescript, и именно поэтому в ней странные имена. При выполнении кода выход будет 3 3 3
. На основании результата выполнения представляется, что порядок выполнения:
enter for loop
settimeout 1 with a function
settimeout 2 with a function
settimeout 3 with a function
settimeout 1 execute
settimeout 2 execute
settimeout 3 execute
Это немного отличается с моим пониманием. Как я понимаю, setTimeout
в цикле for работает асинхронно. Сам оператор setTimeout
может быть выполнен мгновенно. Через несколько миллисекунд (0 в нашем случае) функция начнет выполнение в отдельном контексте. Так что мой ожидаемый порядок исполнения:
enter for loop
settimeout 1 with a function
settimeout 2 with a function, settimeout 1 execute
settimeout 3 with a function, settimeout 2 execute
settimeout 3 execute
на основе загрузки процессора и сложности функции передается setTimeout
, порядок выполнения может отличаться от того, что я описал выше. Но, на мой взгляд, setTimeout может сразу начать выполнение и не нужно ждать завершения цикла for.
Надеюсь, кто-то может помочь прояснить ситуацию. Я проверяю MDN на setTimeout, но не могу получить ничего полезного.
Помимо setTimeout и setInterval, могу ли я рассмотреть все остальные синхронные коды? –
нет, все вызовы ajax также асинхронны. В nodejs почти половина функций асинхронна :) – smnbbrv