• Страница 1 из 1
  • 1
Модератор форума: webik  
Форум » JavaScript и jQuery » JavaScript » Функции » Предупреждение конфликта переменных (Область видимости функции, глобальная и локальная переменные)
Предупреждение конфликта переменных
ABCДата: Пн, 25.03.2019, 00:27 | Сообщение # 1
Offline
Разберём пример, в котором в функции и вне неё есть переменная с одинаковым именем:

Код
var сообщение = 'За пределами функции';
function предупреждение(сообщение) {
alert(сообщение);
}
предупреждение('Внутри функции');
alert(сообщение);


Что мы видим? В первой строке кода мы создаём переменную сообщение и присваиваем ей значение, строку 'За пределами функции'. Эта переменная никак не относится к функции, она снаружи неё (не внутри фигурных скобок блока кода функции), или как говорят "за пределами функции".

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

Вызываем функцию, передаём в качестве аргумента строку: 'Внутри функции'. Что произойдёт при этом? Какой текст выведется в оповещающем окне? 'Внутри функции' или 'За пределами функции'?

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

Код
var сообщение = 'За пределами функции';
function предупреждение(сообщение) {
alert(сообщение);
}
предупреждение('Внутри функции');
alert(сообщение);


а какой результат последней строки нашего кода? alert(сообщение); ? А вот тут в оповещающем окне выведется значение переменной сообщение, созданной нами в самом начале, здесь:

Код
var сообщение = 'За пределами функции';


и в результате будет второе окно оповещения, но уже с текстом 'За пределами функции'.

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

Именно поэтому, к переменной сообщение,созданной здесь:

Код
function предупреждение(сообщение)


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

Так как функция имеет свою область видимости, то имена переменных, выступающих в качестве параметров функции, не вступают в конфликт с похожими именами из остальной части скрипта.
 
профиль цитата изменить удалить
ABCДата: Ср, 27.03.2019, 13:30 | Сообщение # 2
Offline
Рассмотрим еще один вариант: когда переменная создана внутри функции, но не является её параметром.

Переменная, созданная в области видимости функции, называется локальной. Она видна только в пределах функции.


Код
var message = 'За пределами функции';
function warning() {
var message = 'Внутри функции';
alert(message);
}
warning();
alert(message);


Вот такой вот код сейчас разберём. В данном случае переменная message создаётся два раза, вне области функции warning и внутри неё.
Переменная message, созданная внутри функции, является локальной, а переменная message в первой строке основной части сценария(за пределами функции), будет являться глобальной, и к таким переменным имеют доступ все функции сценария.

В нашем коде выше, если мы вызовем функцию warning

Код
warning();


то выполнится код в фигурных скобках этой функции и мы увидим окно с сообщением: "Внутри функции".

Последняя строка кода

Код
alert(message);


выведет окно, но уже с текстом "За пределами функции", поскольку доступа к локальной переменной нет, метод alert() обращается к глобальной переменной message и выводит в окне её значение.
 
профиль цитата изменить удалить
ABCДата: Ср, 27.03.2019, 13:53 | Сообщение # 3
Offline
И еще один интересный пример: есть глобальная переменная message и есть функция warning():

Код
var message = 'Глобальная переменная';
function warning() {
alert(message);
}
warning();


Так вот, при вызове функции warning(), в данном случае мы увидим окно с текстом: "Глобальная переменная", потому что к глобальной переменной имеют доступ все функции сценария.
В данном случае у функции нет параметров и она не определяет переменную message, поэтому при запуске alert(message) функция ищет глобальную переменную с таким именем, находит её и выводит окно с сообщением.
 
профиль цитата изменить удалить
ABCДата: Ср, 27.03.2019, 14:15 | Сообщение # 4
Offline
Переменная существует в области видимости функции только тогда, когда она является её параметром, либо создана внутри функции с помощью ключевого слова var


Сравним два примера с кодом, чтобы понять что происходит. Пример первый:

Код
var message = 'За пределами функции';
function warning() {
var message = 'Внутри функции';
alert(message);
}
warning();
alert(message);


В этом примере переменная message создана два раза, за пределами функции и внутри функции(этот пример мы уже разбирали и тут всё понятно, как они уживаются вполне себе нормально между собой).
Понятно, что при вызове функции в данном случае мы увидим окно с текстом "Внутри функции", а при выполнении последней команды скриптового сценария, увидим окно с текстом "За пределами функции".

А вот другой пример, всё тот же код, что и в примере выше, но отсутствует ключевое слово var у переменной message внутри функции:

Код
var message = 'За пределами функции';
function warning() {
message = 'Внутри функции';
alert(message);
}
warning();
alert(message);


Что происходит в данном случае? а происходит вот что: внутри функции переменная message не создаётся (поскольку отсутствует ключевое слово var), а происходит присваивание нового значения глобальной переменной message,находящейся за пределами функции.
Вы можете освежить свои знания о переменных, их создании и изменении значений тут.

И если мы теперь вызовем функцию

Код
warning();


получим окно с текстом "Внутри функции"

и при выполнении последней строки кода

Код
alert(message);


мы также получим окно с текстом "Внутри функции", так как первоначальное значение "За пределами функции" в глобальной переменной message было заменено на "Внутри функции" вот этой строкой кода:

Код
message = 'Внутри функции';
 
профиль цитата изменить удалить
Форум » JavaScript и jQuery » JavaScript » Функции » Предупреждение конфликта переменных (Область видимости функции, глобальная и локальная переменные)
  • Страница 1 из 1
  • 1
Поиск: