почему вызов window.init из глобальной функции init не вызывает бесконечной рекурсии?
-
21-12-2019 - |
Вопрос
Итак, почему этот код не зацикливается бесконечно?
window.init = function(){
console.log("window.init")
}
function init(){
console.log("init")
window.init();
}
init();
jsfiddle: http://jsfiddle.net/FAt6C/
Решение
Ваш код настроен на запуск при загрузке (см. поля вверху слева), что в основном указывает jsFiddle обернуть этот код в функцию, которая затем устанавливается в качестве обработчика onload. function init()
фактически объявляется в области действия этого обработчика событий, а не в окне.
Однако, даже если вы не переносите код, объявления функций в основном выполняются как часть настройки текущей области, перед другими элементами в этой области (ECMA-262, §10.5).Так init
уже существует до того, как вы скажете window.init =...
, и этот оператор присваивания перезаписывает сломанный init
.Это означает, что если вы установите для переноса значение "без переноса" (независимо от местоположения), вы должны видеть только "window.init" в консоли.