2017-12-20 7 views
1

JavaScriptでは、関数内で作成される変数はその関数内のスコープのみを持ちます:その場合、次のコードはなぜ出力1を生成しますか?確かにxfooの外部からアクセスできませんか?Javascript関数スコープ変数はグローバルスコープで利用可能

function foo(){ 
    x = 1; 
} 
foo() 
console.log(x) // '1' 
+3

このコードは、[厳密モード(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode)に例外をスローします。厳密なモードを常に使用する必要があります。 – Quentin

+3

*関数内で作成された変数は、その関数内でのみスコープを持ちます* *あなたのような暗黙のグローバル*変数の場合は当てはまりません。 – Pointy

+0

宣言されていない変数を使用することは決してありません。 –

答えて

6

var, let or constなしで定義された変数に割り当てられているためです。 のコードがstrictモードでないため、という名前のグローバルオブジェクトの(window)プロパティには、xという名前のプロパティが割り当てられています。 use strictの部分のコメントを解除でき、例外が表示されます。

// 'use strict'; 
 

 
function foo() { 
 
    x = 1; 
 
    console.log(window.x); 
 
} 
 

 
foo(); 
 
console.log(window.x);

あなたがキーワードで宣言する場合は、関数外にアクセスすることはできませんし、それは、window対象になりません。

function foo() { 
 
    let x = 1; 
 
    console.log(x); 
 
} 
 

 
foo(); 
 
console.log(window.x);

+0

恐らく '' use strict ''、' let'/'var'といっしょにいくつかの例を追加するでしょうか? – msanford

0
あなただけ聞かせて、VARせず側で関数を変数を初期化してコードで

またはconstのようにJavaScriptの脅威それグローブ変数

function foo(){ 
 
    x = 1; 
 
} 
 
foo() 
 
console.log(x) // '1'

として

var、letまたはconstを使用すると、以下のように動作します。

function foo(){ 
 
var x = 1; 
 
let y = 1; 
 
const z = 1; 
 
} 
 
foo() 
 
console.log(x) 
 
//console.log(y) 
 
//console.log(z)

+0

あなたはそれを残すべきでした、JSは 'console.log(x)'で停止するので、他の人は決して呼び出されません。 –

+0

@DarrenSweeneyこれらの行をコメントしてくれたことを忘れてありがとう –

関連する問題