私は最近、JavaScript のラムダ計算における η 変換の応用を勉強していたのですが、偶然、stackoverflow で興味深い質問を見かけました。 JavaScript の評価戦略に関して、js 内の関数のパラメータの受け渡しは値渡しですか、それとも参照渡しですか?答えは古典的です。 それを覆う栗関数 changeStuff(a, b, c) { a = a * 10; b.item = "変更されました"; c = {item: "変更されました"}; } var 数値 = 10; var obj1 = {item: "変更なし"}; var obj2 = {item: "変更なし"}; 内容を変更します(num、obj1、obj2); console.log(数値); // 10 console.log(obj1.item); // 変更されました console.log(obj2.item); // 変更なし js 内の関数のパラメータ渡しが値渡しである場合、関数 changeStuff 内の b.item の値を変更しても、外部の obj1 オブジェクトの値には影響しません。 JS の関数パラメータが introduction によって渡される場合、関数 changeStuff 内で行われた変更は関数外のすべての変数定義に影響します。num は 100 になり、obj2.item は changed になります。明らかにそうではありません。 したがって、JS での関数パラメータの受け渡しは厳密に値渡しか導入渡しかであるとは言えません。一般に、関数パラメータは値によって渡されます。 JS では、共有渡しと呼ばれるパラメータ渡し戦略も使用されます。パラメータのタイプによって異なります。 パラメータがプリミティブ型の場合、値によって渡されます。 パラメータが参照型の場合、共有として渡されます。 パラメータの受け渡しECMAScript のすべての関数パラメータは値によって渡されます。つまり、関数の外部の値を関数内のパラメータにコピーすることは、ある変数から別の変数に値をコピーすることと同じです。プリミティブ型の値の転送はプリミティブ型の変数のコピーと同じであり、参照型の値の転送は参照型の変数のコピーと同じです。 -- 高度な JavaScript プログラミング レッドブックには、すべての関数パラメータは値によって渡されると書かれています。これは本当ですか?上記の例を分析してみましょう。 値渡しJavaScript でパラメータとしてプリミティブ型を使用する場合の戦略は、値渡し(値による呼び出し)です。 関数foo(a) { a = a * 10; } var 数値 = 10; foo(数値); console.log(num); // 10 変更なし ここで、関数の内部パラメータの変更は外部変数に影響を与えないことがわかります。値渡しは正しいです。 共同配送JavaScript でオブジェクトをパラメータとして渡す戦略は、共有による呼び出しです。 パラメータのプロパティを変更すると外部オブジェクトに影響します 再割り当ては外部オブジェクトには影響しません 上記の例では、関数内でパラメーター b のプロパティ項目が変更され、関数外のオブジェクトに影響するため、obj1 のプロパティ項目も変更されます。 関数バー(b) { b.item = "変更されました"; console.log(b === obj1) // 真 } var obj1 = {item: "変更なし"}; バー(obj1); console.log(obj1.item); // changed パラメータのプロパティを変更すると、外部オブジェクトに影響します b === obj1 の印刷結果が true であることから、関数内でパラメータの属性を変更しても、パラメータの参照には影響しないことがわかります。 b と obj1 はオブジェクト アドレスを共有しているため、パラメーターのプロパティを変更すると外部オブジェクトに影響します。 パラメータ c を新しいオブジェクトに再割り当てしても、外部オブジェクトには影響しません。 関数 baz(c) { c = {item: "変更されました"}; console.log(c === obj2) // 偽 } var obj2 = {item: "変更なし"}; obj2 を 0 にセットします。 console.log(obj2.item); // 未変更 再割り当ては外部オブジェクトには影響しません パラメータ c を新しいオブジェクトに再割り当てすると、c は新しいオブジェクト アドレスにバインドされ、c === obj2 は false を出力し、同じオブジェクト アドレスを共有しなくなったことを示します。それぞれに個別のオブジェクト アドレスがあります。したがって、再割り当ては外部オブジェクトに影響しません。 要約する共有による受け渡しは、参照アドレスのコピーが渡される、値渡しの特殊なケースであると言えます。つまり、リトル・レッド・ブックに書かれていることは正しいのです。 ECMAScript 関数のパラメータはローカル変数と考えることができます。 -- 高度な JavaScript プログラミング 拡張機能 - 遅延評価先ほど、すべての関数パラメータは値によって渡されることを学びました。 JavaScript では、パラメータは最初に評価され、実際のパラメータとして関数に渡される必要があります。しかし、ES6 には特別なケースがあります。 パラメータのデフォルト値は値渡しされませんが、デフォルト値式の値は毎回再計算されます。つまり、パラメータのデフォルト値は遅延評価されます。 -- 「ECMAScript 6 入門」 x = 99 とします。 関数foo(p = x + 1) { コンソールにログ出力します。 } 関数foo() // 100 100 です 関数foo() // 101 上記のコードでは、パラメーター p のデフォルト値は x + 1 です。このとき、関数fooが呼び出されるたびに、デフォルトのpが100に等しい代わりにx + 1が再計算されます。 上記は、JavaScript の評価戦略に関する詳細な説明です。JavaScript の評価戦略の詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。 以下もご興味があるかもしれません:
|
<<: Nginx での Frp による https への強制リダイレクト設定の詳細な説明
>>: Macシステムをインストールした後にVMWareがフルスクリーンで表示できない問題を解決する
crontab コマンドは、Unix および Linux で定期的な実行命令を設定するために使用され...
最初のステップ組み込みのパッケージ管理機能で一度削除する yum 削除 nodejs npm -y ...
目次1. 4つのコンセプト1. JavaScriptはシングルスレッドです2. タスクキュー3. 同...
Linux インストール JDK1.8 手順1. CentOS に独自の openJDK があるかど...
目次序文基礎を築くプロトタイプコンストラクタのプロパティ__プロト__プロトタイプチェーン改善する要...
原因: java.sql.SQLException: 列の文字列値が正しくありません: '\...
MySQL はインストール時に自動的に mysql という名前のデータベースを作成します。mysql...
目次クラスコンポーネント機能コンポーネントインタビューのよくある質問: React における ref...
最近、社内に Hadoop テスト クラスターを構築したいので、docker を使用して Hadoo...
目次1. プロセスの基本的な概要2. プロセスの構成要素3. プロセス環境4. プロセスステータス5...
最近、多くの学生から Web ページのエンコーディングについて質問を受けています。gb2312 と ...
目次1. 問題の説明2. 問題解決1. 問題の説明Vue プロジェクトを開発する場合、作成時に誤って...
<br />オリジナル: http://www.alistapart.com/artic...
今日ご紹介したいのは、ネイティブ JS を使用してプログレス バーをドラッグし、要素の透明度を変更す...
フロントエンド開発において、$ は jQuery の関数です。$ のパラメータが異なると、実装される...