LINUX.ORG.RU

JavaScript глобальные переменные vs объекты

 ,


0

2

Надеюсь есть специалисты по JavaScript..

Нигде не рекомендуется использовать глобальные переменные, мол плохо для производительности и могут путаться разные переменные с одинаковыми названиями.

Но когда из абсолютно разным мест скриптов нужно манимулировать одними и теми же элементами страницы и их параметрами - почему-то предлогают делать глобальный обьект с атрибутами\методами и использовать его везде (document.getElementById не всегда подходит и это другое): myObject.params.name и т.д.

А какая польза от обьектов вместо обычных глобальных переменных в плане производительности? Ведь всёравно скрипту из места выполнения надо идти искать, где этот объект прописан


Но когда из абсолютно разным мест скриптов нужно манимулировать одними и теми же элементами страницы и их параметрами - почему-то предлогают делать глобальный обьект

Выдыхай бобер, наверняка предлагают сделать шареный объект а не глобальный.

А какая польза от обьектов вместо обычных глобальных переменных в плане производительности?

Не парься на эту тему. Глобальные переменные не советуют делать потому что это говнокод, других связей особо нет.

Vit ★★★★★
()
Ответ на: комментарий от Vit

Про такие обычно пишут:

var obj = { 
            property_1:   value_1,
            2:            value_2,
            // ...,
            "property n": value_n
};

..и его атрибуты потом менять. Да.. скрипт один, просто с обьектом чтото делают в разных не связанных его местах. А что Вы предлагаете использовать вместо глобальных переменных? Этот «obj» пересылать по всем функциям как параметр?

Alexoy
() автор топика
Ответ на: комментарий от Alexoy

Можно как параметр пересылать, можно через this (можно еще через require расшарить {} но это грязновато и смахивает на глобал).

Можно прокидывать сущности типа медиаторов и ресурс-локаторов, которые обеспечат передачу данных и событий.

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

Vit ★★★★★
()
Ответ на: комментарий от Alexoy

Наверное переписать все на сях :)

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

Vit ★★★★★
()

Просто делай свой глобальный объект window.superapp = {} и юзай его в любых местах любых скриптов. $=jQuery = function() точно также глобально определен

gobot ★★★★
()
Ответ на: комментарий от gobot

Я останусь при своем - делать так можно, но это говнокодинг. Что уместнее на конкретном проекте - пусть каждый решает сам.

Vit ★★★★★
()

Напиши обертку над document.getElementById с мемоизацией. :3

Можешь и для классов, и селекторов сделать при условии, что ты не будешь удалять один или более выбираемых элементов

anonymous
()

Потому что 1 свойство-объект в объекте window и 100500 разных свойств это две большие разницы в плане вырывания волос впоследствии.

anonymous
()

А какая польза от обьектов вместо обычных глобальных переменных в плане производительности? Ведь всёравно скрипту из места выполнения надо идти искать, где этот объект прописан

в этом плане небольшой прирост могут дать замыкания. Весь код внутри замыканий будет ресольвится в первую очередь в локальном неймспейсе, и если удачно, то более никуда не лезть не надо. Но на практике — это экономия на спичках. А тот случай который ты описал скорей всего вообще кроссбраузерно прироста не даст.

sedquest
()
Ответ на: комментарий от Vit

В js(dom) нет никаких модулей, есть самый верхний объект window, который и содержит все объекты. Интересно знать как jquery не лезет глобально, а где же он свою функцию jQuery создает, на марсе? Когда ты вызываешь $(".item"), это сокращенная ссылка на window.$() или window.jQuery()

gobot ★★★★
()
Ответ на: комментарий от sedquest

А тот случай который ты описал скорей всего вообще кроссбраузерно прироста не даст

А что тогда предлогаешь делать для увеличения быстродействия? Эти обращения к переменным также в циклах иногда, потому даже небольшое сокращение времени 1 итерации в сумме может сэкономить заметное на глаз время.

Есть смысл пробовать в каждую функцию передавать этот обьект как параметр? Тогда по идее не надо будет далеко ходить в поисках переменных

Alexoy
() автор топика
Последнее исправление: Alexoy (всего исправлений: 1)
Ответ на: комментарий от anonymous

Потому что 1 свойство-объект в объекте window и 100500 разных свойств это две большие разницы в плане вырывания волос впоследствии

А 100500 разных глобальных переменных лучше чтоли?

Alexoy
() автор топика
Ответ на: комментарий от gobot

Если создаешь 1 глобальный объект под сайт то норм. Там и конфиг и все утилиты можно запихать - удобно

Я правильно понимаю, что при ситуации «В функции в функции в функции, в которой другие функции, из которых обращаемся к глобальному обьекту через window.MyObj» поиск переменной всёравно идёт по очереди по каждому скоупу вверх по всем родительским функциям пока не дойдёт до window? Браузер не может как-то к window обращаться напрямую? Иначе это всёравно жуть как медленно

Alexoy
() автор топика
Последнее исправление: Alexoy (всего исправлений: 1)
Ответ на: комментарий от Alexoy

Есть смысл пробовать в каждую функцию передавать этот обьект как параметр? Тогда по идее не надо будет далеко ходить в поисках переменных

Вот, представь себе такую ф-цию

fu = function(object){object.foo}
далее делаешь в цикле
while(counter--) fu(theObject)
У тебя на каждой итерации цикла заново ищется theObject все в том же глобальном объекте. Чем больше переменных в нем, тем дольше будет поиск. Возможно в движках есть оптимиации для таких случаев, но это неизвестно. Так что, х на х менять — только порох терять. Я уже сказал, прирост может дать использование замыканий. Но тут обратная сторона — засирание памяти. Короче, производительность достигается правильной архитектурой, а не экономией на спичках.

sedquest
()
Ответ на: комментарий от sedquest

theObject все в том же глобальном объекте. Чем больше переменных в нем, тем дольше будет поиск

т.е. по такой логике всётаки создание одного глобального обьекта со 100 атрибутами быстрее работает, чем 100 разных глобальных переменых? Потомучто обращаясь к window.myobj.param99 происходит только поиск самого myobj и его атрибута (2 действия, и в window только 1 обьект, т.е. его поиск быстрый), а обращаясь просто к param99 как глобальной переменной происходит поиск по всем 98 предыдущим глобальным переменным (т.е. 99 действий)?! Или я мудрю?

Alexoy
() автор топика
Последнее исправление: Alexoy (всего исправлений: 1)
Ответ на: комментарий от Alexoy

при каждом обращении object.parameter должен сначала найтись object в global а уже затем parameter в object, поэтому, да, ты мудришь. И все это пустое.

sedquest
()
Ответ на: комментарий от sedquest

Ну.. пустое не пустое, а по одному по очереди делая разные оптимизации в сумме в итоге начинает работать быстрее

Alexoy
() автор топика
Ответ на: комментарий от gobot

В js(dom) нет никаких модулей

Ты прослойки типа require.js и commonjs волевым решением отменил? Теперь только хардкор и ни каких анонимных замыканий?

Vit ★★★★★
()
Ответ на: комментарий от Alexoy

Интересно, как можно задать подобный вопрос прочитав пост, на который ты отвечаешь? Перечитай ещё раз и подумай, о чём он.

anonymous
()
Ответ на: комментарий от Alexoy

Интересный вопрос. Вангую, что сначала проверяется есть ли эта переменная в window, а уже потом проверяется вверх по скопам. Но зачем тебе это? Проделай тест, выложи сюда. Ни разу не сталкивался с тормозами в js, как правило все упирается в манипулипование dom деревом, создание, добавление, удаление узла, но это уже от быстродействия браузера зависит, а не от самой реализации js

gobot ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.