Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Локальная переменная становится глобальной? (https://javascript.ru/forum/events/56061-lokalnaya-peremennaya-stanovitsya-globalnojj.html)

111 27.05.2015 22:37

Локальная переменная становится глобальной?
 
Здравствуйте. Есть такой код:

window.onload = function () {
	alert(canvas);
	document.addEventListener("wheel", Wheel);
}


function Wheel (e) {
	var canvas = document.getElementById('canvas');
	canvas.style.top = ...;
	canvas.addEventListener("transitionend", EL);
	function EL() {
		canvas.removeEventListener("transitionend", EL);
		...
	}
}


В результате, алерт выдает объект с id="canvas". Почему? Ведь canvas определяется только внутри Wheel() как локальная переменная.
Спасибо.

Vlasenko Fedor 27.05.2015 23:50

Цитата:

Сообщение от 111
Почему?

Потому как если вы уберете
var canvas = document.getElementById('canvas');
он вам все равно выдаст это элемент.
В js есть возможность работать напрямую с элементами по их ид типа
<input id="test" value="5" type="text">
<script>alert(test.value)</script>

111 28.05.2015 00:18

нифига себе :blink: как это? Это в спецификации языка есть? Или браузеры сотканы из уличной магии?

laimas 28.05.2015 00:40

https://learn.javascript.ru/variables

kostyanet 28.05.2015 06:16

Цитата:

Сообщение от 111
нифига себе

Это не ваша переменная, это просто объект из DOM.

kostyanet 28.05.2015 06:22

Цитата:

Сообщение от Poznakomlus
В js есть возможность работать напрямую с элементами по их ид типа

Не в js, в DOM'е. Что браузер сочтет необходимым скомпилить, то и сочтет. Такое же обсуждение http://stackoverflow.com/questions/3...obal-variables

kostyanet 28.05.2015 06:28

Цитата:

Сообщение от 111
как локальная переменная.

Они все локальные, просто у каждой своя локальность. У глобальной локальность window. window может быть больше 1 штуки.

Говорят - приватная.

Кстати когда браузер компилит элементы формы по их именам эта фича же всем нравится, или как? Да, пишут что тогда если есть id, его значение должно совпадать с name, иначе, пишут, неизвестно чем кончится.

И насчет id. Не надо давать им такие значения, которые бы были похожи на имена переменных и типы элементов и все такое.

Например

id="button_next" - неправильно
id="button-next" - правильно

Улавливаете?

Словом id="-canvas" и никто вас не будет бить по ночам.

Deff 28.05.2015 12:40

111,
У Вас название локальной переменной
Цитата:

var canvas = document.getElementById('canvas');
Идентично уже глобальной переменной ID
Измените название локальной!

111 28.05.2015 13:22

Что ж, огромное спасибо всем за ответы. Такого я от DOM не ожидал ) Век живи - век учись, все такое.

kostyanet 28.05.2015 13:34

Цитата:

Сообщение от Deff
Измените название локальной!

В обозначенном контексте нет ингресса нет конфликта, ничего менять не обязательно.

Интересно другое, что будет если из локальности window присвоить

canvas=5

?


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