2016-05-16 1 views
0
var a = 1; 

function x() { 
    a = 2 
    console.log(a) // 2 
} 
x(); 

console.log(a); // 2 

と:JavaScriptスコープチェーンに関するこれら2つの例の違いは何ですか?

var a = 1; 

function x(p) { 
    p = 2 
    console.log(p) // 2 
} 
x(a); 

console.log(a); // 1 

なぜ第二の実施例1の代わりに2の出力?

+1

[値は引数として渡されます。](http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language) 'p'は' a'との結びつきがなく、 '1'の値だけ、' 2'の値と結びついています。 –

答えて

2

p変数がfunction x(p)内にのみ存在するからです。したがって、メモリ内に新しい領域があり、コピー変数aがあります。最初の例では、変数aのメモリアドレスへのポインタです。一方で

あなたがこれを行うのであれば、オブジェクトは、「参照渡し」があります。

var obj = { foo: 1 }; 

function x(paramObj) { 
    paramObj.foo = "2"; 
} 

x(obj); 
alert(obj.foo); 

をあなたが「2」の代わりに「1」を参照してくださいます。

+0

あなたの例はうまくいますが、 'x()'の引数として 'obj'を渡す必要はありません – Marcus

+0

あなたは正しいので、もっと理にかなって編集しました。コードは同じパラメータ名を使用していましたが、今は私の要点を示しています。 –

0

関数の引数が関数の実行時に '作成'されているためです。

var a = 1; 

function x(p) { 
    p = 2 
    console.log(p) // 2 
}; 

このコードでは、グローバル変数a = 1を作成します。それからx関数に渡します。関数の内部では、与えられたパラメータを2に設定し、console.logにそれを設定します。しかし実際にはこれは次のとおりです。

var a = 1; 


function x(given_argument) { 
    var p = given_argument; 
    p = 2; // global a variable still equals 1; 
    console.log(p) // 2 
}; 

これは、Javascriptに2種類の変数があるためです。数値、文字列、ブール値などの値は、値、配列、オブジェクトなどの参照型です。

あなたがC++を知っていれば、これは少し明るくなるはずです。ここではC++で書かれ、JavaScriptで何が起こるかと等価である:JavaScriptで

// javascript 
var a = 1; // plain value 

// c++ 
int a = 1; // plain value 

// javascript 
var a = {}; // referential type, this is a pointer behind the scenes 
// or 
var a = new Object(); // if you prefer it this way 

// c++ 
Object* a = new Object(); // this is a pointer to the object, but in C++ you make it a pointer explicitly, in Javascript this happens 'automagically'. 

参考種類がポインタあり、それは、引数として渡された場合、彼らは、内部関数から変更することができることを意味します。しかし、数値やブール値のような通常の値を渡すと、関数内で宣言され、暗黙的に発生します。

私はそれが問題を明確にしたと思います。

関連する問題