Jump to content
  • 0

Глобальные и локальные переменные


people2010
 Share

Question

Прочитал, что если в теле функции, например переменная res используется без ключевого слова var,но если в этом теле функции встретится хоть 1 раз var res, все res хоть они использовались как глобальные потому-что внутри тела не писали ключевое слово var, но вконце тела было втстречено var res то использ0ование как глобальную перемнную перечёркивается, и считается что мы работаем внутри тела со всеми переменными res как с локальными.

Вот написал код,что-то не вижу этого правила описанного выше.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Тренировка</title>
<link rel="stylesheet" type="text/css" href="trenirovka.css">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="otd_file.js"></script>

</head>
<script type='text/javascript'>

//a=7; b = 8;
res = 252;

function a(a,b){
if(a>b){
res = 1;
} else if(a<b){
res = -1;
}else{
var res = 0;
}
return res;
}

a(5,6);
alert(res);

</script>
<body>
</body>
</html>

Link to comment
Share on other sites

12 answers to this question

Recommended Posts

  • 0
Белиберда какая-то написана. Сформулируйте правильно вопрос.

Действительно, написан какой-то набор слов, и догадаться что автор имел ввиду можно только если это заранее знать. :-)

Что же так удивило автора первого сообщения?

Считается, что язык JavaScript сделан по образу и подобию C и C++, однако есть целый ряд отличий, и (с точки зрения того, кто привык к С) странностей.

1. Не существует областей видимости как в С, переменная или глобальная (вне функции) или локальная (внутри функции). Даже если переменная описана внутри "блока", т.е. в фигурных скобках, видна она и за пределами этого блока. Также не важно, описана ли переменная до использования или после.

2. Если переменная описана неявно, появляется в левой части присваивания, но без слова var, она считается глобальной, даже если появляется только внутри функции.

Автора скорее всего удивило вот что: он определил глобальную переменную res и присвоил ей значение 252. Внутри функции он присвоил переменной res некоторое значение. Поскольку он ДО ЭТОГО внутри функции переменную res не определял, по его мнению должно присвоиться новое значение одноименной глобальной переменной. На самом же деле поскольку ГДЕ-ТО ВНУТРИ ФУНКЦИИ переменная res явно определена, значение присвоилось локальной переменной, и не важно где именно она определена - после присваивания, внутри блока, внутри кода в условном операторе, который (код) никогда не исполняется. Важно, что переменная явно определена внутри функции.

Link to comment
Share on other sites

  • 0

Если написать так:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>Тренировка</title>
<link rel="stylesheet" type="text/css" href="trenirovka.css">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="otd_file.js"></script>

</head>
<script type='text/javascript'>

//a=7; b = 8;
res = 252;

function a(a,b){
if(a>b){
res = 1;
} else if(a<b){
res = -1;
}else{
var res = 0;
}
return res;
}

alert(a(5,6));

</script>
<body>
</body>
</html>

В результате -1,вроде всё по плану, если же раскрыть коментарии не работает код,почему?

Link to comment
Share on other sites

  • 0

Потому что если раскрыть комментарии, то у вас переопределится функция a. И вылетит ошибка вроде a - не функция. А у вас будет число, т.е. 7.

Можно проверить так:

для первого случая

//a = 7; b = 8;
res = 252;

function a(a, b){
if (a > b) {
res = 1;
} else if (a < b) {
res = -1;
} else {
var res = 0;
}

return res;
}

alert(typeof a);
alert(a.constructor);

для второго случая

a = 7; b = 8;
res = 252;

function a(a, b){
if (a > b) {
res = 1;
} else if (a < b) {
res = -1;
} else {
var res = 0;
}

return res;
}

alert(typeof a);
alert(a.constructor);

разрулить можно так

a = 7; b = 8;
res = 252;

c = function a(a, b){
if (a > b) {
res = 1;
} else if (a < b) {
res = -1;
} else {
var res = 0;
}

return res;
}

alert(typeof a);
alert(a.constructor);
alert(c(a, b));

Link to comment
Share on other sites

  • 0
Потому что если раскрыть комментарии, то у вас переопределится функция a. И вылетит ошибка вроде a - не функция. А у вас будет число, т.е. 7.

..............

разрулить можно так

a = 7; b = 8;
res = 252;

c = function a(a, b){
if (a > b) {
res = 1;
} else if (a < b) {
res = -1;
} else {
var res = 0;
}

return res;
}

alert(typeof a);
alert(a.constructor);
alert(c(a, b));

Я бы не рекомендовал так писать. Можно написать:

function с(a, b){ ...

а можно и так:

c = function(a, b){ ...

(без а)

Кому-то может показаться удивительным, но можно написать и так:

a = function(a, b){ ...

в этом случае переменная а перестает быть семеркой и начитает быть функцией (после выполнения этой строчки кода). Никто не запрещает потом опять переменной а присвоить число.

Но вот писать так

function a(a, b){ ...

нельзя, в этом случае а больше ни для чего использовать нельзя (в той же области видимости). Еще одно отличие, если определить функцию так, то она существует с самого начала, а если через a=function... то только после выполнения этой строчки кода

Да, и еще, не стоит давать одинаковое имя и самой функции, и одному из ее параметров.

Link to comment
Share on other sites

  • 0

Потому что если раскрыть комментарии, то у вас переопределится функция a

Переменная а объявленная выше функции а, превратится в функцию а? В этом переопределение произойдёт?

А что, если выше объявлена переменная с именем а, занчит функцию нельзя назвать с именем а?

Edited by people2010
Link to comment
Share on other sites

  • 0
Потому что если раскрыть комментарии, то у вас переопределится функция a

А что, если выше объявлена переменная с именем а, занчит функцию нельзя назвать с именем а?

Можно, но тогда переменная "а" уже будет функцией, а не простой переменной.

Link to comment
Share on other sites

  • 0
Можно, но тогда переменная "а" уже будет функцией, а не простой переменной.

Если функция определена так:

function a(x,y) {.....}

то нельзя, но так

a = function(x,y){...}

можно, но не могу придумать зачем это может понадобиться

Link to comment
Share on other sites

  • 0
Почему это так можно, ведь "а" в таком случае будет являться ссылкой на функцию?

а - это переменная, она может принимать разные значения, значения разных типов. Во время выполнения скрипта переменной может быть присвоено значение сначала числовое, а потом ссылка на функцию. Это так же, как переменной можно сначала присвоить число, а потом строку. При каждом присваивании старое значение, разумеется, теряется.

Когда мы присвоили переменной а значение типа функция, с этого момента ее можно использовать как функцию, и до того, как мы присвоим ей какое нибудь другое значение.

Это все относиться к записям вида

a = function(x,y){...}

и

a = new function( "x", "y", "..." );

НО

не относится к определению функции таким образом

function a(x,y){...}

В этом случае функция видна везде, даже до того, как была определена (рекомендую проверить), а еще в этом случае имя а использовать ни для чего другого нельзя. И если где-то как-то работает - это не доказательство что можно, т.к. еще где-то работает как-то по-другому. :-)

http://yura.thinkweb2.com/named-function-expressions/

Link to comment
Share on other sites

  • 0

Процесс создания функций таков.

Сначала парсер ищет все декларации function, которые есть в коде, и определяет их.

Например

function foo1 () {}

function foo2 () {}

Далее уже идет выполнение кода.

Если встречается лямбда-функция, которая определена как var foo = function () {}

То процесс создания функции немного другой. Тут создается анонимная функция, и присваивается переменной.

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

Например

var foo2 = function () { alert( foo1() ) };

foo2(); // alert "1"

function foo1 () { return 1 }

Хотя декларация функции foo1 идет после вызова foo2, функция сработает правильно.

А вот в таком примере

var foo2 = function () { alert( foo1() ) };

foo2();

var foo1 = function () { return 1 }

будет ошибка исполнения, так как функция foo1 еще не определена.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy