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 23: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 28.05.2015 00:50

Цитата:

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

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

111 28.05.2015 01:18

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

laimas 28.05.2015 01:40

https://learn.javascript.ru/variables

kostyanet 28.05.2015 07:16

Цитата:

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

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

kostyanet 28.05.2015 07:22

Цитата:

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

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

kostyanet 28.05.2015 07:28

Цитата:

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

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

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

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

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

Например

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

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

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

Deff 28.05.2015 13:40

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

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

111 28.05.2015 14:22

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

kostyanet 28.05.2015 14:34

Цитата:

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

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

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

canvas=5

?

vasa_c 28.05.2015 14:52

думал эта хрень при "use strict" не работает хотя бы, ан нет, работает.

Deff 28.05.2015 15:33

kostyanet,
Речь не о конфликтах, а о путанице для начинающего. В начальной стадии нет смысла запутывать самого себя

kostyanet 29.05.2015 14:02

Цитата:

Сообщение от vasa_c
при "use strict"

Это все потому что народ других ява-скриптов не видел кроме браузерных. Отсюда конкатенация скрипта и документа. use strict - это скрипт, а alert(canvas) - это документ.

Интересно что скриптом можно расширить документ, ну там всякие вы знаете полифилы и нормализаторы пишут, а вот попробуйте-ка сузить. Ну, в принципе, наверно можно так - собрать все ид и всем им навтыкать undefined.


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