2015-01-23 2 views
1

Я читал о грузоподъемных в Mozilla, и заметил пример, объясняющий, как переменная может протекать за пределами области видимости функции: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var#Initialization_of_several_variablesОбъяснение того, как переменная "протекает"?

пример говорит,

var x = 0; 

function f(){ 
    var x = y = 1; // x is declared locally. y is not! 
} 
f(); 

console.log(x, y); // 0, 1 
// x is the global one as expected 
// y leaked outside of the function, though! 

Я не понимаю, что происходит здесь. Я ищу техническое объяснение больше всего. Как вы можете получить доступ на улицу на этом этапе?

Редактировать: Я понимаю, как эта функция ведет себя, и я должен прояснить и сказать, что хочу понять, что происходит в коде и памяти (например, указатели и т. Д.).

+3

Потому что это не префикс 'var'. См. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var - * «Присвоение значения необъявленной переменной неявно создает его как глобальную переменную» * – Phil

ответ

1
var x = 0; 

function f(){ 
    var y = 1; 
    var x = 1; 
} 
f(); 

console.log(x, y); 

Пробуйте вышеуказанный код. Проблема в том, что вы не включили var перед y. Результатом является то, что y поднимается в глобальную область.

1

у вас есть var x = y = 1, что означает, что х объявлена ​​внутри, но у не, var не относится к у в этом случае, именно поэтому она просочилась за пределы функции

+0

, но также и если вы делаете 'var x, y = 1' и делаете консоль, по-прежнему показывает' 0,1' –

+0

@ArpitSrivastava, это показывает Uncaught ReferenceError: y не определен для меня, потому что y не определяется вне функции, когда вы заявляете, что way –

+0

моя плохая первая функция делает 'y' глобальным сейчас, поэтому каждый раз, когда он печатает' 1' –

0

В JavaScript переменные объявлены как только вы будете использовать их, как это:

function f(){ 
    y = 1; 
} 

проблема заключается в том, что у не scoped в f(), как это было бы в большинстве других языков программирования. Так что вы можете сделать что-то вроде этого:

function f(){ 
    y = 1; 
} 

console.log(y); 

И вы увидите, 1 на консоли.

Это, как правило, считается плохой практикой, поскольку оно загрязняет ваше пространство имен и может привести к тонким, трудно отслеженным ошибкам.

Чтобы избежать этого, всегда используйте var явно объявлять переменные, как это:

Это должно дать вам ошибку, как: «неперехваченным ReferenceError: у не определен» на консоли.

Для получения более подробной информации, прочитайте эту страницу, а именно в раздел «Автоматический Global»: http://www.w3schools.com/js/js_scope.asp

В примере вы дали выше проблем является более тонким, поскольку х областью действия правильно, но стенография декларации у делает глобальную область:

function f(){ 
    var x = y = 1; 
} 
0

Это разбивка заявления:

var x = y = 1; 
    \___/ \____/ 
identifier initializer 
    \____________/ 
    variable declaration 

В этом случае Инициализатор - другое назначение. Благодаря переменной грузоподъемных, это утверждение оценивается следующим образом:

var x; 
x = y = 1; 

Как вы можете видеть, y не объявлена. Присвоение переменной uneclared переменная создает глобальную переменную (неявно).

Смежные вопросы