2010-06-21 7 views
2

Я предпочитаю объявить один файл Javascript для всего моего сайта. Я пытаюсь уменьшить использование глобальных переменных. Мои примеры ниже, в обоих случаях каждый объект имеет поле myName.Глобальные переменные или переменные объекта Javascript

  1. Я хотел бы знать, когда они инициализируются?
  2. И с точки зрения памяти и эффективности, который эффективнее?
  3. Для переменной a объявление a.myName совпадает с глобальным «var myName = Rebecca»?
var a = { 
    myName : 'Rebecca' , 

    sayHello : function() { 
     console.log(this.myName); 
    } 
}; 

var b = { 
    myName : function() { 
     return 'Rebecca'; 
    }, 

    sayHello : function() { 
     console.log(this.myName()); 
    } 
}; 

Благодаря

ответ

0
  1. Я считаю, что они будут инициализированы идентично (т.е. когда код достигнут). Другое дело в том, что происходит, когда они инициализируются и где размещается груз, когда их данные действительно требуются.

  2. Для меня это будет зависеть от того, что вы ожидали иметь в myName. Если бы это была просто строка, я бы избежал функции и пошел с выбором a. С другой стороны, если была задействована большая логика, и эта логика может не потребоваться (например, если она выполняется только тогда, когда пользователь нажимает кнопку или приложение достигает определенного состояния) d пойти с выбором b. Насколько я понимаю, функция действительно потребляет память и не будет собирать мусор (это минус), но она также не будет потреблять ресурсы ЦП, пока она не понадобится (что может быть огромным плюсом).

  3. Я не уверен, что понимаю этот вопрос, но я бы сказал, что это не то же самое. Если единственным членом a является myName, то эти два эквивалента (оба они занимают глобальное пространство имен.Но если у вас есть несколько свойств, экономия становится очевидной. Из ваших примеров, я думаю, ясно, что вы это понимаете, поэтому я снова не понимаю этого вопроса.

+0

На самом деле, я готов использовать свою память и процессор, когда мне нужны эти переменные. Я просто хочу ленить загрузить мои строковые переменные. – Cemo

+0

Я большой поклонник ленивой загрузки, но, насколько мне известно, ленивая загрузка помогает только в том случае, если вы хотите отложить большое «распределение ресурсов» (использование памяти, использование процессора и/или время выполнения). Использование функции, которая возвращает только строковый литерал («Ребекка»), будет использовать больше памяти, займет больше времени для синтаксического анализа и займет больше времени, чем просто с использованием строкового литерала. На сколько больше? Ну, наверное, очень, очень мало. Я бы не стал называть это лучшей практикой. – Andrew

+0

Возможно, вы заметили мои предпосылки в начале. Я хочу использовать только один файл javascript для всего моего сайта. Загрузка этих переменных на всех других страницах для меня не имеет смысла. Вот почему я начал думать о другой альтернативе. Как сохранить эти данные при некоторых переменных? Кэширование - не простое решение? – Cemo

0

Они будут инициализированы, когда операторы впервые встречаются. В a, 'Rebecca' инициализируется как значение для ключа myName. В b это всего лишь данные, внутренние для функции myName (анонимный). a будет немного более эффективным, поскольку он избегает вызова функции. Я также считаю его более читаемым в этом простом примере.

Я нахожу выбор, чтобы поставить все в одном файле под вопросом. В некоторых случаях вам нужен модульный дизайн. И поскольку вы обеспокоены эффективностью (хотя возможно, преждевременно), обратите внимание, что наличие одного большого файла может нанести ущерб производительности, если страницы содержат код, который им не нужен.

-1

a не имеет никакого смысла, поскольку вы регистрируете ссылку на функцию. B - путь, потому что вы на самом деле вызываете метод, используя().

0

1) Они инициализируются, когда скрипт обрабатывается в браузере, если вы не объявляете объекты в обработчике событий. В этом случае объект создается при выполнении сценария события.

2) С точки зрения эффективности, a, вероятно, будет более эффективным. Обратите внимание, что в первом случае вы используете a.myName, а во втором b.myName(), чтобы получить значение свойства.

3) Нет. Если вы присваиваете значение объекту объекта, вам всегда нужно получить это значение через объект. В этом случае либо a.myName, либо a['myName'].

+0

a.myName vs. a.myName(): первый может быть изменен в любое время, в то время как последний всегда будет возвращать «Ребекку». – Dormilich

+0

'a.MyName' также может быть изменено. 'a.myName = function() {return" Deborah "; }; ' –

Смежные вопросы