Я до конца не понимаю этот вот тонкий механизм:
//код ниже противоречив, компилятор вытаскивает функцию наружу, хотя код внутри if не должен выполнятся:
;(function(){
if(false) function foo(){console.log("foo")}
console.log(foo) // [Function: foo]
})()
//а вот так противоречия уже нет:
;(function(){
if(false)var foo=function(){console.log("foo")}
console.log(foo) // undefined
})()
//а теперь внимание! Бомба!!!
// что с "use strict" что без:
foo()//foo
if(false)function foo(){console.log("foo")}
//И особенно непонятно вот это:
scope={msg: "Hello!"}
with(scope){
function inner(){
console.log(msg)
}
}
inner()
// ошибка: msg не определен
scope={msg: "Hello!"}
with(scope){
inner=function inner(){
console.log(msg)
}
}
inner()
//так норм
При этом, в ФФ вроде работает как ожидается, хотя все не проверял. Я понимаю, смутно, что эти все аномалии связаны с процессом компиляции, но что конкретно происходит, общая "логика", так сказать, до меня не доходит. В примерах с ифами еще более менее понятно: видимо, компилятор в первом проходе компилирует все function declarations, не обращая внимание на окружающий код, то что называется "подъем". А с with -- вообще задница.
Я вот еще что думаю. Если от function declaration (или как ее там) столько проблем, почему бы ее просто не убрать из языка? Трудности какие-то с этим, или что?
И вообще: НАХРЕН ОНА НУЖНА? ЗАЧЕМ ЕЕ ЗАПИЛИЛИ? Можно увидеть юзкейс, где без нее нельзя обойтись?