Почему не следует использовать var в global
Наверное, многие думают, что объявленная в global переменная с var отличается от той что без var только тем, что имеет скрытое св-во dontdelete. Я выяснил, что в node, помимо этого, она не копируется в global. Возможно, еще где-нибудь. Это значит, к примеру, что она не будет доступна через конструкцию for(i in global). Поэтому, в общем случае, не стоит объявлять через вар в глобальной области. Объявляя без вар мы ничего не теряем. Но не наоборот. Так что это тупой базворд, не надо слушать этих умников от CS.
|
Стоит различать свойства глобального объекта и глобальные переменные.
Почитай, например http://dmitrysoshnikov.com/ecmascrip...riable-object/ Отличие не только в dontdelete var Object; //глобальная функция alert(typeof Object); //по прежнему доступен var postMessage; //свойство объекта window alert(typeof postMessage) //теперь до postMessage можно достучаться // только с помощью window.postMessage |
В соседней теме на то же тебе же отвечал, процитирую:
Цитата:
|
Цитата:
|
Цитата:
|
Object undefined?
|
Цитата:
Object=1 console.log(typeof Object)// number |
Цитата:
|
Цитата:
var Object=1; console.log(typeof Object)//number так, то что с var, что без, number |
Цитата:
Цитата:
|
Цитата:
|
strict mode - режим соответствия современному стандарту.
|
Вот пример на ноде:
Есть модуль A: var func = require("B"); for(i = 0; i < 2; i++) { func(); } И модуль B: module.exports = function () { for(i = 2; i != 0; i--) console.log(i); }; И вуаля! Вот таким нехитрым способом можно прострелить себе ногу. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
для меня принципиально важно понять надо ли мне отказывать себе в использовании синтаксического сахара упрощенного объявления переменных: х.у.имя1 = х.у.имя2 |
Ты путаешь. Это свойства, а не переменные. Свойства, разумеется, объявлять не надо.
|
Цитата:
|
Цитата:
|
Цитата:
я говорю что по сути для программиста есть только два типа именованых контейнеров - глобальный и локальный соответствнно логично разделить методы их обявления ну какой же есть смысл использования var в глобале если тот же самый эфект и даже лучше достигается методом добавьСвойство |
Ты, чтоли, об этом? Ну можно и методом defineProperty(window, value). Можно и через window.value. Технически разницы нету. Но мне почему-то кажется, что так не проще)
|
nverv, чувак, никто тебе не запрещает писать
this.foo = ... Более того это типичный пример "портируемого" кода для разных окружений, т.к.: браузер - глобальный объект поток - глобальный объект node - exports *** Плохо когда пишут: foo = т.к. такое поведение было убрано из стандарта - хорошо это или плохо другой вопрос, но на мой взгляд они сделали всё правильно, т.к. подход к переменным в JS изначально был неверный и в ECMAScript6 это исправили (добавили let и const). Кого раздражает синтаксическая многословность, то посмотрите в сторону CoffeeScript и прочих транслируемых в JS языков. *** В новый стандарт JS добавили нативные модули, и при их использовании var будет добавлять не в global space, а в контекст модуля (как в ноде) и тут уже очевидная разница. JS эволюционирует, т.к. меняются его задачи и сферы применения, так например появятся типы, структуры, уже появились "настоящие" массивы и возможность ручного управления памятью и ещё куча всего. От того, что кому то кажется сложным мир не изменится и это сугубо твои проблемы. Не хочешь учиться - иди работать в макдональдс. |
Цитата:
window.value = 1 вопрос- наплевать ли мне на этот запрет и жить удобнее, или с самого начала приучиться использовать defineProperty ? склоняюсь к таком простому способу создания именованых контейнеров |
Цитата:
|
Цитата:
Нельзя писать Цитата:
|
Цитата:
|
Да вот кто б говорил...
|
Цитата:
" все переменные должны объявляться... стр 134 или тут речь только о локальных переменных создаваемых var |
nverv, ты просто не правильно понял, если ты явно пишешь кому ты ставишь свойство - то юзай на здоровье.
Плохо когда юзают такие штуки a = 2 // неявная декларация global.a = 2 function bar() { b = 3 // неявная декларация global.b = 3 } foo // неявная декларация document.getElementById('foo') |
Цитата:
Цитата:
|
спасибо товарищи, отпустило
я то их в душе называю - именованые глобальные и локальные контейнеры а они - свойства и переменные |
Цитата:
|
Переменные в объекте? Свойства из функций? Что? :blink:
|
Цитата:
global.a=1 function getHuy(x){ return global.a+x } getHuy(1)//huy тебе а не global.a |
Даже отвечать на этот бред не хочется.
|
Цитата:
|
Цитата:
|
Цитата:
|
Опять же
Цитата:
|
Часовой пояс GMT +3, время: 10:10. |