Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Применение анонимных функций (https://javascript.ru/forum/misc/10331-primenenie-anonimnykh-funkcijj.html)

Бормртун 29.06.2010 07:35

Применение анонимных функций
 
Прочитал замечательный цикл статей у Сошникова, Глава5 вызвала вопросы, на которые надеюсь получить ответ здесь.
В каком случае следует применять
var foo = function(){...}
а в каком
function foo(){...}
?
Зачем "не загрязнять объект переменных" ? Пусть будет грязный :) А если все таки не загрязнять, то стоит ли вообще пользоваться конструкциями
function foo(){...}

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

B~Vladi 29.06.2010 08:26

Цитата:

Сообщение от Бормртун
Насколько я понял, то, только функцию, сохраненную по ссылке в переменную, можно сохранить в объекте.

Нет, любую можно сохранить.
Цитата:

Сообщение от Бормртун
В каком случае следует применять

Как тебе больше нравится.
Цитата:

Сообщение от Бормртун
Зачем "не загрязнять объект переменных" ? Пусть будет грязный А если все таки не загрязнять, то стоит ли вообще пользоваться конструкциями

Лучше, если ты сам это поймешь. Все приходит с опытом.

Бормртун 29.06.2010 09:16

Смысл использования
(function(){...}())
мне понятен, например так можно выставить флаги при инициализации, ничего при этом "не загрязняя". Но при присвоении анонимной функции переменной, различий между function declaration и function expression я не вижу. Объясните пожалуйста чайнику, неужели это просто code conventions? Ведь должна быть какая то разница, а не просто нравится ненравится?

exec 29.06.2010 09:22

Цитата:

В каком случае следует применять var foo = function(){...}

а в каком function foo(){...}

?

Функция, объявленная через var foo = function () {}, будет определена только после её объявления, а функция, объявленная через function foo(){}, определена везде.

alert(x); // ReferenceError
var x = function () {}


alert(x); // function x() {}
function x() {}

Kolyaj 29.06.2010 09:24

FD создаётся при входе в контекст, FE -- когда до неё выполнение дойдёт.

Kolyaj 29.06.2010 09:25

Цитата:

Сообщение от exec
определена везде.

Не везде, а в скопе.

Цитата:

Сообщение от exec
alert(x); // ReferenceError
var x = function () {}

ReferenceError не будет.

Бормртун 29.06.2010 09:38

Можно немного конкретики?
var logged = false;
(function(){ /*тут запрос к серверу */.... logged = !!data; })();

var auth = {
    loginhandler: function(){ ....  logged = true},
    logouthandler: function() {... logged = false}
}

$('#loginbtn').bind('click', auth.loginhandler);
$('#logoutbtn').bind('click', auth.logouthandler);


чем лучше или хуже
var logged = false;
(function(){ /*тут запрос к серверу */.... logged = !!data; })();

function loginhandler() { ....  logged = true},
function logouthandler() {... logged = false}

$('#loginbtn').bind('click', loginhandler);
$('#logoutbtn').bind('click', logouthandler);

или равнозначно? Может я в дебри лезу, но все же.

pharrell 01.08.2011 05:03

Цитата:

чем лучше или хуже
Это одинаково.Вот пример полезности первого случая.
Например, у тебя на сайте есть чат и комментарии.
И ним у тебя есть функции для загрузки аяксом контента. И для удобства делаеться так

var chat={
load:function(){//загрузка данных для чата
}
}
var comment={
load:function(){//загрузка данных для комментариев
} 
}

Тоесть просто для удобства. согласись, вызывать так
chat.load();
comment.load();

Удобнее и красивее, чем так
loadComments();
loadChat()

Kolyaj 01.08.2011 12:13

Цитата:

Сообщение от pharrell
Тоесть просто для удобства. согласись, вызывать так
chat.load();
comment.load();

Удобнее и красивее, чем так
loadComments();
loadChat()

Вот для данного конкретного примера вообще не вижу разницы. Второй вариант даже читается легче: "загрузить каменты", вместо "камент загрузить".

jg_shift 29.12.2011 12:33

а еще typeof у них разные у function foo(){...} это 'function', а у var foo = function(){...} это 'object'


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