Просмотр полной версии : Почему не следует использовать var в global
Наверное, многие думают, что объявленная в global переменная с var отличается от той что без var только тем, что имеет скрытое св-во dontdelete. Я выяснил, что в node, помимо этого, она не копируется в global. Возможно, еще где-нибудь. Это значит, к примеру, что она не будет доступна через конструкцию for(i in global). Поэтому, в общем случае, не стоит объявлять через вар в глобальной области. Объявляя без вар мы ничего не теряем. Но не наоборот. Так что это тупой базворд, не надо слушать этих умников от CS.
Стоит различать свойства глобального объекта и глобальные переменные.
Почитай, например http://dmitrysoshnikov.com/ecmascript/ru-chapter-2-variable-object/
Отличие не только в dontdelete
var Object; //глобальная функция
alert(typeof Object); //по прежнему доступен
var postMessage; //свойство объекта window
alert(typeof postMessage) //теперь до postMessage можно достучаться
// только с помощью window.postMessage
В соседней теме на то же тебе же отвечал, процитирую:
Это пережиток былого. В современном javascript при объявлении переменных ВСЕГДА нужно использовать var (ну либо const/let). Попробуй объявить без var в строгом режиме - и интерпретатор радостно выдаст ошибку.
"use strict";
try {
somevar = 100;
}
catch (e) {
alert(e);
}
В node.js область видимости текущего скрипта не равна глобальной области видимости. Каждый модуль создает свою область видимости. Потому объявленная через var переменная не становится глобальной, да.
В соседней теме на то же тебе же отвечал, процитирую:
Я в соседней теме тебе ответил, добавлю только, что про область видимости модулей я не говорил, че ты их приплетаешь сюда, я хз
по прежнему доступен
А что он из себя представляет? В node он undefined. А у Вас что?
по прежнему доступен
попробовал в Firefox вот так:
Object=1
console.log(typeof Object)// number
Object undefined?
Да, в firefox и в node, если
var Object=1;
console.log(typeof Object)//number
так, то что с var, что без, number
Я в соседней теме тебе ответил
Процитирую ту часть моего ответа на твой ответ, что как раз в тему этой темы:
Мне плевать на него [strict mode]
То есть, ты признаешь ранние стандарты, а на современные тебе плевать?) Ну-ну, продолжай в том же духе.
стандарты
Это не стандарт
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);
};
И вуаля! Вот таким нехитрым способом можно прострелить себе ногу.
strict mode - режим соответствия современному стандарту.
Опциональный
И вуаля! Вот таким нехитрым способом можно прострелить себе ногу.
И что?
Опциональный
Желательный. Очень желательный. Существует он лишь для того, чтобы код, написанный по ранним стандартам, работать продолжал.
Желательный. Очень желательный. Существует он лишь для того, чтобы код, написанный по ранним стандартам, работать продолжал.
какова вероятность что "жесткий режим" будет обязательный? и когда
для меня принципиально важно понять надо ли мне отказывать себе в использовании синтаксического сахара упрощенного объявления переменных: х.у.имя1 = х.у.имя2
Ты путаешь. Это свойства, а не переменные. Свойства, разумеется, объявлять не надо.
И что "и что"?
Какое это отношение имеет к тому, что я сказал?
Ты путаешь. Это свойства, а не переменные. Свойства, разумеется, объявлять не надо.
я не путаю
я говорю что по сути для программиста есть только два типа именованых контейнеров - глобальный и локальный
соответствнно логично разделить методы их обявления
ну какой же есть смысл использования var в глобале если тот же самый эфект и даже лучше достигается методом добавьСвойство
Ты, чтоли, об этом? Ну можно и методом defineProperty(window, value). Можно и через window.value. Технически разницы нету. Но мне почему-то кажется, что так не проще)
kobezzza
27.06.2014, 15:59
nverv, чувак, никто тебе не запрещает писать
this.foo = ...
Более того это типичный пример "портируемого" кода для разных окружений, т.к.:
браузер - глобальный объект
поток - глобальный объект
node - exports
***
Плохо когда пишут:
foo =
т.к. такое поведение было убрано из стандарта - хорошо это или плохо другой вопрос, но на мой взгляд они сделали всё правильно, т.к. подход к переменным в JS изначально был неверный и в ECMAScript6 это исправили (добавили let и const).
Кого раздражает синтаксическая многословность, то посмотрите в сторону CoffeeScript и прочих транслируемых в JS языков.
***
В новый стандарт JS добавили нативные модули, и при их использовании var будет добавлять не в global space, а в контекст модуля (как в ноде) и тут уже очевидная разница.
JS эволюционирует, т.к. меняются его задачи и сферы применения, так например появятся типы, структуры, уже появились "настоящие" массивы и возможность ручного управления памятью и ещё куча всего. От того, что кому то кажется сложным мир не изменится и это сугубо твои проблемы. Не хочешь учиться - иди работать в макдональдс.
Ты, чтоли, об этом? Ну можно и методом defineProperty(window, value). Можно и через window.value. Технически разницы нету. Но мне почему-то кажется, что так не проще)
но же "строгий режим" запрещает так писать -
window.value = 1
вопрос- наплевать ли мне на этот запрет и жить удобнее, или с самого начала приучиться использовать defineProperty ?
склоняюсь к таком простому способу создания именованых контейнеров
но же "строгий режим" запрещает так писать -
window.value = 1
С чего бы вдруг? Не запрещает.
kobezzza
27.06.2014, 16:06
но же "строгий режим" запрещает так писать -
window.value = 1
Ты путаешь, так писать можно - это нормальное поведение.
Нельзя писать
value = 1
Не хочешь учиться - иди работать в макдональдс.
Строго наоборот. Хомячье не понимает программирования, поэтому ему нужен сахар. Инженер превращается в секретаршу с интерфейсом, но зато их теперь много, и можно клепать энтерпрайз.
Ты путаешь, так писать можно - это нормальное поведение.
а читая фленагана я понял что нельзя так
"
все переменные должны объявляться... стр 134
или тут речь только о локальных переменных создаваемых var
kobezzza
27.06.2014, 16:49
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
Даже отвечать на этот бред не хочется.
не хочется
Скорей не можется. Потому что ты не врубаешься в семантику жабаскрипта, поэтому тебя такие вопросы ставят в тупик. Стандарт прочитать, не значит понять язык
kobezzza
27.06.2014, 17:36
Даже отвечать на этот бред не хочется.
Ну на самом деле, в "чисто" функциональных языках такой сценарий есть и сделан он в первую очередь, чтобы 100% гарантировать, что результат функции зависит только от её входных параметров, но для языка общего назначения - это перебор, хотя, если бы был введён новый вид функций для этой фичи, то было бы прикольно.
в "чисто" функциональных языках
В чисто функциональных языках другая фича -- иммутабельность. Здесь же идет речь о том, что у замыканий свой неймспейс, у объектов (которые под капотом тоже функции) свой. Глобальный скоп замыканий пересекается с неймспейсом глобального объекта. Так вот, если они считают, что из объекта не следует иметь доступ к глобальному скопу замыканий, логично было бы изолировать и неймспейс объектов от обращения изнутри функций. И получим 2 отдельных языка, которые не пересекаются.
Опять же
Даже отвечать на этот бред не хочется.
Опять же
опять же
Скорей не можется.
В чисто функциональных языках другая фича -- иммутабельность. Здесь же идет речь о том, что у замыканий свой неймспейс, у объектов (которые под капотом тоже функции) свой. Глобальный скоп замыканий пересекается с неймспейсом глобального объекта. Так вот, если они считают, что из объекта не следует иметь доступ к глобальному скопу замыканий, логично было бы изолировать и неймспейс объектов от обращения изнутри функций. И получим 2 отдельных языка, которые не пересекаются.
по моему ерунда
же функции это полноценные отдельные программы которые работают либо со своими локальными либо с чужими глобальными именоваными контейнерами
есть две базовые единицы - алгоритмы и данные, но в алгоритмах собственные данные, и в данных алгоритмы
же функции это полноценные отдельные программы которые работают либо со своими локальными либо с чужими глобальными именоваными контейнерами
Так оно и есть. В чем противоречие?есть две базовые единицы - алгоритмы и данные, но в алгоритмах собственные данные, и в данных алгоритмы
Это базворды пошли есть 2 базовые единицы: текст программы (данные для исполнителя) и исполнитель. Ниакой концептуальной разницы между программами (текстом их) и данными нет. Текст программы, вместе с так называемыми "данными" -- это данные для абстрактного исполнителя
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot