2017-01-18 9 views
1

Насколько я знаю, переменные, объявленные внутри функции, являются локальными переменными (с использованием ключевого слова var или нет). Если да, то почему этот вывод 5? Должен ли я получить ReferenceError при вызове func2, потому что x известен только func1?Создание глобальных переменных внутри функции - почему это работает?

<script> 
    function func1(){ 
     x = 5; 
    } 

    function func2(){ 
     document.write(x); 
    } 

    func1(); 
    func2(); 
</script> 
+1

_ "переменные, объявленные внутри функции" _, что вы не сделали поскольку вы не использовали 'let' или' var' –

+0

Переменные локальны, когда объявлены с помощью 'val'. В противном случае они глобальны. –

+0

Читайте на [JavaScript Scope] (https://toddmotto.com/everything-you-wanted-to-know-about-javascript-scope/). –

ответ

2

Afaik, variables declared inside a function are local variables (using var keyword or not).

Переменные объявленные внутри функции являются локальными, но вы не объявляя никаких переменных. У вас есть то, что известно как «неявное глобальное», и оно работает только в «неаккуратном режиме».

От MDN:

Assigning a value to an undeclared variable implicitly creates it as a global variable (it becomes a property of the global object) when the assignment is executed.

В строгом режиме, код выдает ошибку:

"use strict"; 
 

 
function func1() { 
 
    x = 5; 
 
} 
 

 
function func2() { 
 
    document.write(x); 
 
} 
 

 
func1(); 
 
func2();

+0

, так что на самом деле существует способ создания глобальных функций внутри функций. благодаря! – onTheFence

+1

@onTheFence Да, это возможно, но это очень плохая идея. Вот почему он вызывает ошибку в строгом режиме. – JLRishe

2

Это потому, что вы не определили его как

function func1(){ 
    var x = 5; 
} 

Это означает, что JS будет использовать глобальную переменную x, который не существует, но при запуске func1.

Добавление переменной "var" определяет переменную в пределах локальной области func1.

1
function func1(){ 
    x = 5; 
} 

эквивалентно

var x; // In global scope 
function func1(){ 
    x = 5; 
} 

Поскольку переменная не была областью видимости func1 с декларацией.

Если это так, то вы столкнетесь с ошибкой в ​​консоли, так как вы пытаетесь получить доступ к переменной, которая еще не определена.

function func1(){ 
    var x = 5; 
}