2017-11-27 11 views
4

これはちょうど私の心を吹いた:ローカル変数は同じ名前のパラメータを上書きしませんか?

function f(x) { 
 
    var x; 
 
    console.log(x); // prints 100! 
 
} 
 

 
f(100);

私はいつもあなたがローカル変数を宣言したときに、前に宣言されたのと同じ名前を使って何がそれの後ろに隠れてしまうことを考えるために使用されます。なぜvar xは他の状況でやったのと同じようにxundefinedを作っていないのですか?

var x = 100; 
 
function f() { 
 
    var x; 
 
    console.log(x); // prints undefined as expected 
 
} 
 

 
f();

+3

'var'宣言は基本的に無視されます。 – Pointy

+0

2つの異なるスコープが関係しているため、2番目のコード例は関係ありません。関数宣言の仮引数リストは、関数の字句的範囲内のパラメータシンボルの 'var'宣言と事実上同じことをします。 – Pointy

+0

'The local var' - このフレーズは、あなたがローカル変数が本当に何かを誤解していると思います。関数の引数もローカル変数です。ですから、基本的にこれは次のようなことです: 'var x = 100; var x'はjavascriptで合法で、人々がforループなどで 'var'を宣言できるようにします。 – slebetman

答えて

1

機能コードの場合、パラメーターもその環境レコードへのバインディングとして追加されます。

定義されたパラメータxは、現在の関数に汲み上げられています。 xは既にパラメータとして関数内で宣言されているので、var x;宣言は無視されます。詳細については

:シンボルがすでに宣言されているためhttp://es5.github.io/#x10.5

2

両方varとパラメータ同じ関数スコープ内の同じ変数xを宣言:

は、私が使用されるように動作し、このコードと比較します。変数が作成されると、undefinedに初期化され、すぐに引数として渡された値100が割り当てられます。 MDN#varから

0

説明

...あなたはJavaScript変数を再宣言した場合、それはその価値を失うことはありません。最初の例で

xが既に関数f(引数として)内で宣言されているので、同じ関数内(varを使用して)、それを再宣言することである(すなわち再宣言前x同じ値を維持しますパラメータが呼び出されるとfに与えられます)。

第2の例では、xが関数fで宣言されています。したがって、に渡すxの値を調べると、xの内部にはf(外部のものではない)が使用されています。明示的に値を与えていないので、その値はundefinedになります。

関連する問題