Волшебные "функции"
Я до конца не понимаю этот вот тонкий механизм:
//код ниже противоречив, компилятор вытаскивает функцию наружу, хотя код внутри 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 (или как ее там) столько проблем, почему бы ее просто не убрать из языка? Трудности какие-то с этим, или что? И вообще: НАХРЕН ОНА НУЖНА? ЗАЧЕМ ЕЕ ЗАПИЛИЛИ? Можно увидеть юзкейс, где без нее нельзя обойтись? |
http://javascript.ru/unsorted/id
Почему бы не прикрутить на форум? |
ты где этот код нарыл?
|
как то была тема про with, и говорили что ей не рекомендуется пользоваться
|
Цитата:
|
Цитата:
Каждый из вариантов объявлений имеет свое предназначение. Function Declaration создают функцию ДО выполнения кода Function Expression создают функцию когда до них доходит выполнение. Поэтому комментарий "//а теперь внимание! Бомба!!!" отпал бы, если почитали бы учебник. |
И снова он )
яркий и запоминающийся почерк у человека )) |
ВЕТЕРАН, какая разница, как реализована эта кривизна, она не перестает от этого быть таковой. Вы бы ради приличия привели бы юзкейс, как я просил, где function declaration действительно необходимы, где они оправдывают свое существование в языке. Читайте тему, прежде чем отвечать. Если не знаете ответа, не морочте людям голову, проходите мимо.
|
petya,
кривизна - это пытаться использовать что-то не по назначению. Используйте Function Expression там где нужно и не будет вопросов. |
ВЕТЕРАН, С точки зрения пользователя языка, это именно кривизна дизайна, пользователь не обязан постоянно думать о своем коде с точки зрения тонкостей процесса компиляции. И главный вопрос, таки, остается открытым. Каково непосредственное НАЗНАЧЕНИЕ function declaration?
|
Часовой пояс GMT +3, время: 07:29. |