Це явище відоме як: Змінне підняття JavaScript .
Ви жодного разу не отримуєте доступ до глобальної змінної у своїй функції; ви лише коли-небудь отримуєте доступ до локальної value
змінної.
Ваш код еквівалентний наступному:
var value = 10;
function test() {
var value;
console.log(value);
value = 20;
console.log(value);
}
test();
Все ще здивований, що ти отримуєш undefined
?
Пояснення:
Це те, на що рано чи пізно стикається кожен програміст JavaScript. Простіше кажучи, будь-які змінні, які ви оголошуєте, завжди піднімаються у верхній частині вашого локального закриття. Отже, навіть якщо ви оголосили свою змінну після першого console.log
виклику, все одно вважається, що ви оголосили її до цього.
Однак піднімається лише частина декларації; доручення, з іншого боку, не є.
Отже, коли ви вперше зателефонували console.log(value)
, ви посилалися на свою локально оголошену змінну, яка їй ще нічого не призначила; отже undefined
.
Ось ще один приклад :
var test = 'start';
function end() {
test = 'end';
var test = 'local';
}
end();
alert(test);
Що, на вашу думку, це насторожить? Ні, не просто читайте далі, подумайте. У чому цінність test
?
Якщо ви сказали щось інше, ніж start
, ви помилилися. Наведений вище код еквівалентний цьому:
var test = 'start';
function end() {
var test;
test = 'end';
test = 'local';
}
end();
alert(test);
так що на глобальну змінну ніколи не впливає.
Як бачите, незалежно від того, де ви розміщуєте декларацію змінної, вона завжди піднімається до верхньої частини вашого локального закриття.
Примітка:
Це стосується і функцій.
Розглянемо цей фрагмент коду :
test("Won't work!");
test = function(text) { alert(text); }
що дасть вам посилання на помилку:
Uncaught ReferenceError: тест не визначений
Це викидає багатьох розробників, оскільки цей фрагмент коду чудово працює:
test("Works!");
function test(text) { alert(text); }
Причина цього, як зазначено, полягає в тому, що частина завдання не піднята. Отже, у першому прикладі, коли test("Won't work!")
було запущено, test
змінна вже оголошена, але ще не має призначеної їй функції.
У другому прикладі ми не використовуємо призначення змінних. Швидше за все , ми використовуємо правильний синтаксис оголошення функції, яка робить отримати функцію повністю поставили.
Бен Черрі написав про це чудову статтю з відповідною назвою Обсяг та підняття JavaScript .
Читати. Це дасть вам повну картину з усіма деталями.