29.06.2014, 23:14
|
Профессор
|
|
Регистрация: 17.05.2014
Сообщений: 197
|
|
Sweet,
Я думаю, не совсем так.
foo="bar" // объявляем свойство глобального объекта
var foo // объявляем переменную, в которую копируется значение свойства глобального объекта
delete foo // пытаемся удалять переменную - false, и вместе с этим удаляется св-во в глобале
console.log(global.foo)// это не имеет никакого отношения к переменной, и кроме того, мы это свойство удалили
console.log(foo)// bar - ибо почему бы и нет = так оно и должно быть.
Последний раз редактировалось foo, 29.06.2014 в 23:18.
|
|
29.06.2014, 23:21
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,586
|
|
Сообщение от foo
|
Дайте линк
|
Хмм, быстро не нашёл, но точно помню что когда-то давно об этом читал здесь. Читайте весь учебник - не пропустите.)
А по вопросу: объявления var происходят в начале функции независимо от того где они указанны в коде.
Т.е.
alert(a);
var a = 123;
это на самом деле
var a;
alert(a);
a = 123;
Соответственно и в васшем примере:
foo="bar" // foo уже локально ибо ниже объявлена через var
var foo //объявляем переменную
delete foo //удаление несуществующего
console.log(global.foo) //undefined(было таким и до delete)
console.log(foo) //bar
__________________
29375, 35
Последний раз редактировалось Aetae, 29.06.2014 в 23:28.
|
|
29.06.2014, 23:27
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
А я не думаю, я - знаю. Можешь проверить. Объяви в одном модуле:
global.foo = "value";
А затем в другом:
console.log(foo); // undefined - это значение переменной
foo="bar" // присваеваем переменной
var foo // объявляем переменную
delete foo // пытаемся удалять переменную - false
console.log(global.foo)// value, потому что глобальное свойство мы не трогали
console.log(foo)// bar
|
|
29.06.2014, 23:34
|
Профессор
|
|
Регистрация: 17.05.2014
Сообщений: 197
|
|
Сообщение от Aetae
|
было таким и до delete
|
В вашей схеме все правильно с виду, но моя точней отражает суть происходящего. Тут, насколько я понял, дело в том, что транслятор проходит текст проги за 2 раза. В первом проходе, он делает подстановку во все вары. В браузерах на этом все и заканчивается. А в ноде он вместе с подстановкой удаляет соответствующие св-ва глобала.
|
|
29.06.2014, 23:37
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,586
|
|
*facepalm.jpg*
foo
__________________
29375, 35
|
|
29.06.2014, 23:38
|
Профессор
|
|
Регистрация: 17.05.2014
Сообщений: 197
|
|
Сообщение от Sweet
|
модуле
|
Я не хочу сейчас модули обсуждать, это прямого отношения к делу не имеет. Косвенное отношение в том, что это уродство сделали именно для подключения модулей, да, чтобы из них не попадало ненужное в глобал. То есть, кривая реализация из-за которой пришлось патчить язык. Поведение стало еще менее очевидным чем было. Т.е. кривизна модульности.
А что касаемо реально происходящего, см выше.
|
|
29.06.2014, 23:54
|
Профессор
|
|
Регистрация: 17.05.2014
Сообщений: 197
|
|
Сообщение от Aetae
|
facepalm.jpg
|
Подумай над этим, раз такой умный
global.a=eval("1")
var a
a//undefined
|
|
29.06.2014, 23:55
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от foo
|
Я не хочу сейчас модули обсуждать, это прямого отношения к делу не имеет.
|
Просто запусти на ноде такой код:
console.log(arguments);
И прозрей: в ноде весь код оборачивается в функцию! Там нет кода, исполняющего в глобальном окружении.
Всё остальное - это просто бредни человека, который толком ничего не знает и не имеет опыта, но бредит какой-то хренотенью, типа "я самый умный, я понял, что var в глобале не нужен". Но
Сообщение от foo
|
что касаемо реально происходящего
|
, ты ничего не понимаешь.
|
|
30.06.2014, 00:03
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Сообщение от foo
|
Подумай над этим, раз такой умный
|
Я уже объяснил, почему оно так. Потому что в ноде этот код исполняется так:
var global = window;
var program = 'global.a=eval("1");\
var a;\
alert(a); //undefined';
Function("exports, module, __filename, __dirname", program)(/*arguments*/);
|
|
30.06.2014, 00:04
|
Профессор
|
|
Регистрация: 17.05.2014
Сообщений: 197
|
|
Сообщение от Sweet
|
Там нет кода, исполняющего в глобальном окружении.
|
Да? A это что?
a=1
console.log(a)
И что ты вообще называешь глобальным окружением? То глобальное (с var) что внутри модуля -- есть глобальное для этого модуля, как, впрочем и для функции. Ты не понимаешь, что такое глобальное окружение. Есть глобальный объект и есть глобальное окружение, в JS это не одно и тоже.
|
|
|
|