Когда вы используете ключевое слово var в глобальной области видимости, объявленная переменная становится свойством глобального объекта. В веб-браузере глобальный объект - это объект window
, который сам является экземпляром DOMWindow()
. Итак, используя эти знания, мы можем переписать ваш код так:
window.fn = function () {
return window.fn();
}();
Забрав начальное назначение, мы имеем
(function () {
return window.fn();
})();
... которая определяет анонимную функцию, в которой вызывается window.fn()
. Однако в момент выполнения этого кода window.fn
не является функцией (и никогда не будет), поэтому возникает исключение, потому что вы пытаетесь вызвать его, даже если у него нет внутреннего флага [[Call]]
.
Если вы уберете немедленное выполнение анонимной функции, тогда window.fn
будет функцией:
var fn = function () {
return fn();
}
fn(); //-> infinite loop