Я только начал работать в новой компании и заметил что-то, что мне кажется совершенно неправильным во многих их JS. Я немного не решаюсь поднимать этот вопрос, не подтверждая, что это неправильно, так как я довольно молодой, я не эксперт JS, и это только мой второй день, и я не хочу выглядеть глупо.
Итак, обычно я ожидаю, что шаблон модуля будет выглядеть примерно так:
MODULENAME = MODULENAME || {};
MODULENAME.SUBMODULENAME = (function() {
var bla = {};
bla.somefunction = function() {
//do stuff
};
//add more stuff to bla
return bla;
}());
Что у них есть по всему коду:
MODULENAME = MODULENAME || {};
MODULENAME.SUBMODULENAME = (function() {
var that = this;
that.somefunction = function() {
//do stuff
};
//add more stuff to that
return that;
}());
Теперь, конечно, поскольку функция не вызывается как конструктор с ключевым словом new
или как метод, this
привязана к window
, и они определяют that
как this
. Таким образом, они в основном сбрасывают все в глобальный объект, и все имена их подмодулей на самом деле являются псевдонимами для window
. Есть ли причина, по которой кто-то хотел бы это сделать? Или это действительно так неправильно, как мне кажется?
Изменить:
Я сделал ошибку, поставив var
перед определением подмодуля, изначально я написал что-то немного другое и забыл удалить var
. Я также попытался сделать пример немного яснее, надеюсь, теперь более очевидно, что я имею в виду.
Редактировать 2:
Также я просмотрел сценарии, выполняемые в Firebug, и они определенно добавляют все к window
, этот объект — полный беспорядок.
this
не ссылается на класс или элемент? Я тоже не уверен, что понимаю ваш вопрос. - person Fabrício Matté   schedule 09.05.2012this
может быть чем угодно, в зависимости от окружения (но, насколько я понимаю,this
действительно относится к глобальному объекту) - person Joseph   schedule 09.05.2012var
должен быть в первой строке, а не во второй. - person bfavaretto   schedule 09.05.2012this
относится к окну. Смотрите сами - person Danilo Valente   schedule 09.05.2012}.call({}));
? - person cliffs of insanity   schedule 09.05.2012}.call({}));
. - person Michal   schedule 09.05.2012this
/that
? Это восхитительно. Пожалуйста, опубликуйте вскрытие :) Единственная причина, по которой вы это сделаете, - поддержка небраузерных сред, добавление методов к глобальному объекту, который может не бытьwindow
. - person Ricardo Tomasi   schedule 09.05.2012