Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   document.getElementById return undefined (https://javascript.ru/forum/events/48327-document-getelementbyid-return-undefined.html)

foo 29.06.2014 23:14

Sweet,
Я думаю, не совсем так.
foo="bar" // объявляем свойство глобального объекта 
var foo // объявляем переменную, в которую копируется значение свойства глобального объекта
delete foo // пытаемся удалять переменную - false, и вместе с этим удаляется св-во в глобале
console.log(global.foo)// это не имеет никакого отношения к переменной, и кроме того, мы это свойство удалили
console.log(foo)// bar - ибо почему бы и нет = так оно и должно быть.

Aetae 29.06.2014 23:21

Цитата:

Сообщение от foo (Сообщение 318705)
Дайте линк

Хмм, быстро не нашёл, но точно помню что когда-то давно об этом читал здесь. Читайте весь учебник - не пропустите.)

А по вопросу: объявления 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

Sweet 29.06.2014 23:27

Цитата:

Сообщение от foo
Я думаю

А я не думаю, я - знаю. Можешь проверить. Объяви в одном модуле:
global.foo = "value";

А затем в другом:
console.log(foo); // undefined - это значение переменной
foo="bar" // присваеваем переменной
var foo // объявляем переменную
delete foo // пытаемся удалять переменную - false
console.log(global.foo)// value, потому что глобальное свойство мы не трогали
console.log(foo)// bar

foo 29.06.2014 23:34

Цитата:

Сообщение от Aetae
было таким и до delete

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

Aetae 29.06.2014 23:37

*facepalm.jpg*
foo

foo 29.06.2014 23:38

Цитата:

Сообщение от Sweet
модуле

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

А что касаемо реально происходящего, см выше.

foo 29.06.2014 23:54

Цитата:

Сообщение от Aetae
facepalm.jpg

Подумай над этим, раз такой умный
global.a=eval("1")
var a
a//undefined

Sweet 29.06.2014 23:55

Цитата:

Сообщение от foo
Я не хочу сейчас модули обсуждать, это прямого отношения к делу не имеет.

Просто запусти на ноде такой код:
console.log(arguments);
И прозрей: в ноде весь код оборачивается в функцию! Там нет кода, исполняющего в глобальном окружении.
Всё остальное - это просто бредни человека, который толком ничего не знает и не имеет опыта, но бредит какой-то хренотенью, типа "я самый умный, я понял, что var в глобале не нужен". Но
Цитата:

Сообщение от foo
что касаемо реально происходящего

, ты ничего не понимаешь.

Sweet 30.06.2014 00:03

Цитата:

Сообщение от foo
Подумай над этим, раз такой умный

Я уже объяснил, почему оно так. Потому что в ноде этот код исполняется так:
var global = window;

var program = 'global.a=eval("1");\
var a;\
alert(a); //undefined';

Function("exports, module, __filename, __dirname", program)(/*arguments*/);

foo 30.06.2014 00:04

Цитата:

Сообщение от Sweet
Там нет кода, исполняющего в глобальном окружении.

Да? A это что?
a=1
console.log(a)

И что ты вообще называешь глобальным окружением? То глобальное (с var) что внутри модуля -- есть глобальное для этого модуля, как, впрочем и для функции. Ты не понимаешь, что такое глобальное окружение. Есть глобальный объект и есть глобальное окружение, в JS это не одно и тоже.


Часовой пояс GMT +3, время: 04:08.