Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Волшебные "функции" (https://javascript.ru/forum/misc/50237-volshebnye-funkcii.html)

BETEPAH 19.09.2014 12:24

Цитата:

Сообщение от petya
И главный вопрос, таки, остается открытым. Каково непосредственное НАЗНАЧЕНИЕ function declaration?

объявление функции с доступом к ней в любом месте кода, как после объявления, так и до объявления.
Цитата:

Сообщение от petya
пользователь не обязан постоянно думать

поднятый вами вопрос не заставляет особо думать. Это на уровне механики. Нужен доступ к функции везде в области видимости - Function Declaration. Нужен доступ только после объявления - Function Expression.
Конструкции if не создают свою область видимости, поэтому код
foo()
if(false) function foo(){console.log("foo")}
не скрывает foo() в условии. Неужели это нужно разжевывать еще тщательнее? Если бы использовали Function Expression в этом коде, то функция не была бы объявлена, так как до нее не дошел бы код.
Извините, я потерял интерес к дальнейшему диалогу в этой ветке.

petya 19.09.2014 12:31

Цитата:

Сообщение от ВЕТЕРАН
Конструкции if не создают свою область видимости, поэтому код

Причем тут область видимости?
Практически во всех языках if обладает свойством ЛЕНИВОСТИ. ОН НЕ ДОЛЖЕН выполнять код, если условие не совпадает. В нашем же случае, семантически, он выполняет его или не выполняет в зависимости от погоды на марсе.

petya 19.09.2014 12:36

Цитата:

Сообщение от ВЕТЕРАН
объявление функции с доступом к ней в любом месте кода, как после объявления, так и до объявления.

Повторяю: ЗАЧЕМ РЕАЛЬНО это нужно?

petya 19.09.2014 12:39

Цитата:

Сообщение от ВЕТЕРАН
потерял интерес к дальнейшему диалогу в этой ветке.

Видимо потому, что по существу возразить нечего.

tsigel 19.09.2014 13:44

petya,
Рельно это нужно для того чтобы функция знала как её зовут и могла что-то с собой делать.

var trololo = function () {alert(arguments.callee.name)};
trololo()


function trololo() {alert(arguments.callee.name)}
trololo();


В чисто конкретном месте я использовал это для обертки над классами (чтобы в консоли у объектов были нормальные имена) и для модуля логгера, который мог вывести всю цепочку наследования моего класса
(Например он вывадил "Base.Module.UserEventManager")

petya 19.09.2014 14:18

tsigel, НЕТ

var trololo = function trololo () {console.log(arguments.callee.name)};
trololo()

tsigel 19.09.2014 14:34

Цитата:

Сообщение от petya (Сообщение 331356)
tsigel, НЕТ

var trololo = function trololo () {console.log(arguments.callee.name)};
trololo()

И что это должно значить?

trololo()
var trololo = function trololo () {console.log(arguments.callee.name)};
trololo()

petya 19.09.2014 14:39

tsigel,
Это значит, что имя функции это одно, а function declaration -- совершенно другое. Не по теме твой пример.

tsigel 19.09.2014 14:54

petya,
Ну если это разные вещи и я говорю не по теме, то попробуй создать функцию с одинаковым именем переменной и самой функции так, чтобы она была объявлена в условии. И если условие не выполнится то функции не должно быть.

petya 19.09.2014 15:14

tsigel,

if(0)foo=function foo(){}
console.log(foo)//error


Часовой пояс GMT +3, время: 05:40.