サンプルコード。


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScript sample</title>
<script>
 
function change_1(data){
  var newData = {
    name: 'Bob',
    age: 20
  };
  data = newData;
}
 
function change_2(data){
  var newData = {
    name: 'Carol',
    age: 30
  };
  data.name = newData.name;
  data.age = newData.age;
}
 
var data = {
  name: 'Alice',
  age: 10
};
console.log('no change: ' + data.name + ': ' + data.age);
 
change_1(data);
console.log('change_1: ' + data.name + ': ' + data.age);
 
change_2(data);
console.log('change_2: ' + data.name + ': ' + data.age);
</script>
</head>
<body>
</body>
</html>

console.log の出力結果。


no change: Alice: 10
change_1: Alice: 10
change_2: Carol: 30

ということは、

  • 関数内で引数の変数オブジェクトに代入しても、関数の外には影響しない。
  • 関数内で引数の変数オブジェクトを操作すると、関数の外にも影響する。

JavaScript は Java と同様の挙動をするんだなと理解。

正直、 Mozilla の資料を読んでもよくわからなかった。

関数の仮引数 (パラメータ) には、関数呼び出しにおいて実引数 (アーギュメント) が渡されます。実引数は、関数に「値渡し」されます: 関数の中で引数の値を変更しても、その変更はグローバルスコープもしくは呼び出し元の関数内には反映されません。オブジェクト参照も「値」ですが、こちらは特別です: 参照されているオブジェクトのプロパティを関数の中で変更すると、次の例にあるように、その変更を関数の外部から見ることができます:

関数と関数スコープ - JavaScript | MDN

サンプル書くと理解が深まる。

今回のサンプルコード置き場 (何も表示されないページだけど) ⇒ JavaScript sample

tags: javascript

Posted by NI-Lab. (@nilab)