English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
値の伝搬(call by value)は最も一般的な評価戦略であり、関数の引数は呼び出されたときに実引数のコピーである。引数の値の変更は実引数に影響を与えない。
参照の伝搬(call by reference)では、関数の引数は実引数の暗黙的な参照を受け取るが、コピーではなく。これは、関数の引数の値が変更された場合、実引数も変更されることを意味し、両者が同じ値を指すことになる。
参照の伝搬(call by reference)は、関数呼び出しの追跡をより難しくし、時には微妙なバグを引き起こすこともある。
値の伝搬は、それぞれのコピーをクローンする必要があるため、一部の複雑な型ではパフォーマンスが低い。両方の値の伝搬方法にはそれぞれの問題がある。
JSの基本型は、値の伝搬による。
var a = 1; function foo(x) { x = 2; } foo(a); console.log(a); // まだ1, 未受x = 2割り当てが影響する
次に、オブジェクトの引き渡しについて見てみましょう:
var obj = {x : 1}; function foo(o) { o.x = 3; } foo(obj); console.log(obj.x); // 3, 修正されました! var obj = {x : 1}; function foo(o) { o = 100; } foo(obj); console.log(obj.x); // それでも1, obj は変更されませんでした。100.
オブジェクトの値引き渡しは参照引き渡しではありません。実際には、シェア引き渡し(call by sharing)と正確に言えば、JSでは基本型は値引き渡し、オブジェクト型はシェア引き渡し(call by sharing、参照引き渡しや参照共有引き渡しとも呼ばれます)。
この戦略のポイントは、関数に引数を渡す際、関数はオブジェクト引数の参照のコピーを受け取ります(値引き渡しのオブジェクトのコピーではなく、参照引き渡しの暗黙の参照でもありません)。これは参照引き渡しとは異なり、シェア引き渡し(call by sharing)においては、関数の引数に対する割り当てが引数の値に影響を与えません。
つまり、基本型は値引き渡しであり、オブジェクトの場合、引数にはオブジェクトが指すアドレスが渡されます。これも特別な値引き渡しと考えられます。関数内でオブジェクトの属性に対して操作を行う場合、実際にはそのオブジェクトが指す属性に対して操作を行います。しかし、その全体に対して操作を行う場合(例えば:o =)、 100またはo = [])は、実際には新しいオブジェクトが定義され、引数の参照アドレスは新しいオブジェクトの参照アドレスであり、元の参照とは何の関係もありません。したがって、元のオブジェクトに影響を与えません。
以上で、編集者が皆さんに紹介したJSが値引き渡しであるか、参照引き渡しであるか(推奨)に関する全ての知識を紹介しました。皆さんに役立つことを願っています。何か疑問があれば、コメントを残してください。編集者は皆さんの質問に迅速に回答します。このサイトへのサポートに感謝しています!
声明:この記事の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、本サイトは所有権を持ちません。人工的な編集は行われていません。また、関連する法的責任を負いません。著作権に疑われる内容が見つかった場合は、メールで notice#w までお知らせください。3codebox.com(メールを送信する際、#を@に変更してください。申し訳ありませんが、報告を行い、関連する証拠を提供してください。一旦確認がとれましたら、本サイトは侵害が疑われる内容をすぐに削除します。)