関数の引数が関数の実行時に '作成'されているためです。
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'.
参考種類がポインタあり、それは、引数として渡された場合、彼らは、内部関数から変更することができることを意味します。しかし、数値やブール値のような通常の値を渡すと、関数内で宣言され、暗黙的に発生します。
私はそれが問題を明確にしたと思います。
[値は引数として渡されます。](http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-value-language) 'p'は' a'との結びつきがなく、 '1'の値だけ、' 2'の値と結びついています。 –