Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.09.2014, 00:17
Аспирант
Посмотреть профиль Найти все сообщения от petya
 
Регистрация: 02.09.2014
Сообщений: 77

Волшебные "функции"
Я до конца не понимаю этот вот тонкий механизм:
//код ниже противоречив, компилятор вытаскивает функцию наружу, хотя код внутри 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 (или как ее там) столько проблем, почему бы ее просто не убрать из языка? Трудности какие-то с этим, или что?

И вообще: НАХРЕН ОНА НУЖНА? ЗАЧЕМ ЕЕ ЗАПИЛИЛИ? Можно увидеть юзкейс, где без нее нельзя обойтись?

Последний раз редактировалось petya, 18.09.2014 в 01:37.
Ответить с цитированием
  #2 (permalink)  
Старый 18.09.2014, 15:43
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

http://javascript.ru/unsorted/id
Почему бы не прикрутить на форум?
Ответить с цитированием
  #3 (permalink)  
Старый 18.09.2014, 16:55
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

ты где этот код нарыл?
Ответить с цитированием
  #4 (permalink)  
Старый 18.09.2014, 16:59
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

как то была тема про with, и говорили что ей не рекомендуется пользоваться
Ответить с цитированием
  #5 (permalink)  
Старый 18.09.2014, 23:44
Аспирант
Посмотреть профиль Найти все сообщения от petya
 
Регистрация: 02.09.2014
Сообщений: 77

Сообщение от skrudjmakdak Посмотреть сообщение
как то была тема про with, и говорили что ей не рекомендуется пользоваться
Возможно (хотя спорно), но в данном случае, это отношения к делу не имеет. Здесь хрень заключена в кривизне реализации функций, а точней, обработки компилятором function declaration.
Ответить с цитированием
  #6 (permalink)  
Старый 19.09.2014, 10:22
Аватар для BETEPAH
Профессор
Отправить личное сообщение для BETEPAH Посмотреть профиль Найти все сообщения от BETEPAH
 
Регистрация: 23.06.2011
Сообщений: 1,165

Сообщение от petya
десь хрень заключена в кривизне реализации функций, а точней, обработки компилятором function declaration.
Кривизной это кажется только тем, кто не знаком с основами объявления функций.
Каждый из вариантов объявлений имеет свое предназначение.
Function Declaration создают функцию ДО выполнения кода
Function Expression создают функцию когда до них доходит выполнение.
Поэтому комментарий "//а теперь внимание! Бомба!!!" отпал бы, если почитали бы учебник.
Ответить с цитированием
  #7 (permalink)  
Старый 19.09.2014, 11:20
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

И снова он )
яркий и запоминающийся почерк у человека ))
Ответить с цитированием
  #8 (permalink)  
Старый 19.09.2014, 12:07
Аспирант
Посмотреть профиль Найти все сообщения от petya
 
Регистрация: 02.09.2014
Сообщений: 77

ВЕТЕРАН, какая разница, как реализована эта кривизна, она не перестает от этого быть таковой. Вы бы ради приличия привели бы юзкейс, как я просил, где function declaration действительно необходимы, где они оправдывают свое существование в языке. Читайте тему, прежде чем отвечать. Если не знаете ответа, не морочте людям голову, проходите мимо.
Ответить с цитированием
  #9 (permalink)  
Старый 19.09.2014, 12:09
Аватар для BETEPAH
Профессор
Отправить личное сообщение для BETEPAH Посмотреть профиль Найти все сообщения от BETEPAH
 
Регистрация: 23.06.2011
Сообщений: 1,165

petya,
кривизна - это пытаться использовать что-то не по назначению. Используйте Function Expression там где нужно и не будет вопросов.
Ответить с цитированием
  #10 (permalink)  
Старый 19.09.2014, 12:17
Аспирант
Посмотреть профиль Найти все сообщения от petya
 
Регистрация: 02.09.2014
Сообщений: 77

ВЕТЕРАН, С точки зрения пользователя языка, это именно кривизна дизайна, пользователь не обязан постоянно думать о своем коде с точки зрения тонкостей процесса компиляции. И главный вопрос, таки, остается открытым. Каково непосредственное НАЗНАЧЕНИЕ function declaration?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск