Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как заставить функцию при запуске увидеть ГЛОБАЛЬНУЮ переменную? (https://javascript.ru/forum/dom-window/7947-kak-zastavit-funkciyu-pri-zapuske-uvidet-globalnuyu-peremennuyu.html)

возжаждавший 28.02.2010 01:56

Как заставить функцию при запуске увидеть ГЛОБАЛЬНУЮ переменную?
 
Друзья! По загрузке документа ззапускается функция test(), которая должна видеть ГЛОБАЛЬНУЮ переменную
Возможно ли такое? НЕ видит напрочь! Вот код
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>Документ без названия</title>
<script>
 var per= document.getElementById("ima")
 function test () {
  //var per= document.getElementById("ima")
  //СЕйчас эта переменная не видна! Но если объявить её локальной, тоона будет видна
  per.value="конец"
 }
</script> 

</head>

<body onload="test()">
<input name="ima" type="text" id="ima" value="начало" />
</body>
</html>


Собсно в нём всё понятно, при загрузке документа запускается функция test. которая должна изменить значение поля таким вот хитрым способом. Не изменяет.

А если по другому объявить используемую переменную (локальной),то изменяет.

Но мне надо чтобы она видела именно глобальную переменную озможно ли такое? И если нет. сразу вопрос- как быть? Я предполагаю использовать несколько функций, использующих одни и те же значения. И что мне теперь, для каждолй функции объявлять локальные переменные? Несерьёзно как-то. Извините, если что не так. Спасибо.

Octane 28.02.2010 02:29

Переменная то видна, а вот её значение null, потому что вы ищите элемент до того, как он появляется в документе.

Tim 28.02.2010 02:34

function test()
{
	per = document.getElementById("ima");
	per.value="конец";
}


Дело в том, что вы пытаетесь установить ссылку на элемент в то время как документ ещё не догружен. Глобальную переменную можно объявить прямо из функции убрав ключевое слово var - это называется неявное обьявление глобальной переменной.

Выриант 2:
function test()
{
	per.value="конец";
}


onload = function()
{
	per = document.getElementById("ima");
	test();
}

Ключевое слово var также не используем, иначе per обьявится как локальная переменная анонимной функции. Ещё, как вариант, можно попробовать вставить код в самый конец документа, чтобы к моменту выполнения скрипта успел загрузиться input. Это кстати должно повысить скорости формирования и отображения страницы т.к. браузер не будет отвлекаться на скрипты пока не отобразит документ.

Octane 28.02.2010 02:37

Цитата:

Сообщение от Tim
Глобальную переменную можно объявить прямо из функции убрав ключевое слово var - это называется неявное обьявление глобальной переменной.

Это не глобальная переменная уже будет, а свойство объекта window ;)

Tim 28.02.2010 02:40

Цитата:

Это не глобальная переменная уже будет, а свойство объекта window
а глобальные переменные разве не свойства объекта window?

Octane 28.02.2010 02:42

Цитата:

Сообщение от Octane
объекта window

поправка: глобального объекта

Цитата:

Сообщение от Tim
а глобальные переменные разве не свойства объекта window?

http://javascript.ru/blog/Dmitry-A.-....#o-peremennyh

Tim 28.02.2010 02:50

Octane,
спс, оч познавательно.

возжаждавший 28.02.2010 02:58

Ребята, спасибо большое. Я предполагал нечто, но нуждался в уточнении. А я свой вариант придумал. Ужасно, конечно (функция вызывает функцию), но работает.
var per
function test () {
 per= document.getElementById("textfield")
 test_1()
}
function test_1 () {
 per.value="novoe_value"
}


Tim, кстати, о том, что если переменную объявить внутри функции без var, то она будет глобальной... Я думал обратное! Автор вот этого труда http://javascript.ru/tutorial/founda...last-vidimosti
при всём моём уважении к нему как-то расплывчато, что ли, написал о этом. То же и в читаемой мной книге Гудмана и Моррисона. Размыто.

А Вы внесли ясность.

Lastron 23.02.2017 01:27

Цитата:

Сообщение от Tim
Выриант 2:
function test()
{
	per.value="конец";
}


onload = function()
{
	per = document.getElementById("ima");
	test();
}

дать бы по рукам за гениальность )

правильное решение передачи данных в функцию из вне

function test(){
	var per = "конец";
	return per;
}


function test2(){
	alert(test());
}


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