2017-01-18 1 views
1

私が知る限り、関数内で宣言された変数はローカル変数です(varキーワードを使用しているかどうか)。 もしそうなら、なぜこの出力は5でしょうか? xfunc1にしか知られていないので、func2を呼び出すときにReferenceErrorを取得してはいけませんか?関数内でのグローバル変数の作成 - これはなぜ機能するのですか?

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

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

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

_ "関数の内部で宣言された変数" _、あなたがdidntは:strictモードで

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.

は、あなたのコードはエラーを生成します'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から

"use strict"; 
 

 
function func1() { 
 
    x = 5; 
 
} 
 

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

 
func1(); 
 
func2();

+0

だから実際に関数内にグローバルを作成する方法があります。ありがとう! – onTheFence

+1

@onTheFenceはい、可能ですが、それは非常に悪い考えです。そのため厳密なモードでエラーが発生します。 – JLRishe

2

あなたはこれを使用すると、関数func1を実行したときにJSが存在しますが、しないグローバル変数xを使用することを意味し

function func1(){ 
    var x = 5; 
} 

としてそれを定義していないからです。

"var"を追加すると、ローカル範囲func1内の変数が定義されます。

1
function func1(){ 
    x = 5; 
} 

変数を宣言してfunc1にスコープされなかったよう

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

と等価です。

この場合、まだ定義されていない変数にアクセスしようとしているため、コンソールにエラーが表示されます。関数内を宣言

function func1(){ 
    var x = 5; 
} 
関連する問題