2017-12-21 7 views
1

なぜそれは私が次の操作を実行したときにということである。右手側ではなく左手側にパラメータを渡す違いは何ですか?

var a = 1; 
 

 
function foo(a) { 
 
    a = 2; 
 
} 
 

 
foo(); 
 
console.log(a); // a = 1

しかし、私は次のように異なる結果を得る:a場合

var a = 1; 
 

 
function foo() { 
 
    a = 2; 
 
} 
 

 
foo(); 
 
console.log(a); // a = 2

+1

「jsグローバルスコープとローカルスコープ」を検索すると、 – RomanPerekhrest

+1

[JavaScriptの可変シャドウイングの例]の可能な複製が作成されます(https://stackoverflow.com/questions/11901427/an-example-of- variable shadowing-in-javascript) – Andreas

+0

または、関数の 'a = 2'が' var a = 2'に変更されている点を除いて、2番目の例に基づく3番目の例はどうですか? – j08691

答えて

0

を渡されますその関数内の引数として、その関数内のaの値が分離され、その関数内でのみアクセス可能になります。そうでなければ、関数の外で定義されたaは、すべての関数とオブジェクトで共有されます。

@RomanPerekhrestに同意します。上記のコードで**

var a = 1; 
function foo(a) { 
    a = 2; 
} 
foo(); 
console.log(a); // a = 1 

コメントへの応答で

** UPDATE、行2及び3にaへの言及は、コードの行1および6にa異なる変数でありますあなたのコメントからfoo機能内のxの値にaを設定しています。元の質問とは少し違います。いいえ?

+0

var a = 1;関数foo(x){ a = x; } foo(2); console.log(a); // a = 2 – BitByBit

1

最初の例では関数fooパラメータaグローバル変数aシャドーイングされるので、グローバル変数の値は変化しません。最初の例のコードは、これと同等である:あなたが機能fooの体内グローバル変数aを参照している第2の例では

var a = 1; 

function foo(x) { 
    x = 2; 
} 

。ここでは可変シャドーイングが発生しないため、期待される結果が得られます。a2の値に割り当てられます。

0

JavaScriptには、実際には「左右のパラメータ」がありません。最初の例はパラメータを渡します。 2番目の例では、closureが使用されています。

クロージャ(字句クロージャまたは関数クロージャも)は、ファーストクラス関数を持つ言語でレキシカルスコープのネームバインディングを実装するための手法です。操作上、クロージャは、環境と一緒に関数を格納するレコードです。関数の各フリー変数(ローカルで使用されるが囲みスコープで定義される変数)と、その名前がバインドされた値または参照と関連付けられたマッピングクロージャが作成されました。クロージャは、プレーン関数とは異なり、関数がスコープ外で呼び出された場合でも、クロージャの値または参照のコピーを使用して、キャプチャされた変数にアクセスできるようにします。最初の例で

、機能foo内部変数a関数のa外側とは異なる変数です。 fooのパラメータaを変更すると、グローバル変数aには影響がなく、console.logに渡されます。

2番目の例では、変数aはパラメータではなく、関数fooによって取得された環境の一部です。 foo内の割り当てとfoo外のconsole.logコールの呼び出しは、実際には同じ変数を参照しているため、ログにはaの変更値が表示されます。

関連する問題