検索
ホームページウェブフロントエンドjsチュートリアルJavaScriptの関数呼び出しのコード詳細

おそらく多くの人が

JavaScript を学習する過程で 関数パラメータ送信メソッドの混乱に遭遇したことがあると思いますが、JavaScript での関数呼び出しの知識についてのチュートリアルを共有します。興味がある方は、共有してみましょう

定義

おそらく多くの人が、JavaScript を学習する過程で、関数のパラメータの受け渡し方法について混乱に遭遇したことがあると思います。ソース コードでいくつかの答えを見つけますが、その前に、まずいくつかの概念を明確にしてください。値の受け渡し、

reference受け渡しなどの固有の名前を放棄して、英語に戻ります:

参照による呼び出し && 値による呼び出し && 共有による呼び出し

は、それぞれ参照の受け渡しと値の受け渡しとして理解されるものです。 C++。 3 番目の説明はさらに混乱します。公式の説明では、

オブジェクトへの参照のコピーを受け取ります。分かりやすい言葉で説明しましょう: オブジェクトは

key

のコレクションとして理解できます。オブジェクトは、キーが指すデータを指します (ここでは、それがポインター実装であるか C++ 参照実装であるかについては詳しく説明しません)。 ) 関数が受け取るのは 変数 コピーの場合、変数にはオブジェクトへの参照が含まれており、値によって渡されます。 すると、関数がパラメータを渡すときに受け取る

object

type パラメータは、実際には実際のパラメータのコピーであることは明らかです。そのため、オブジェクトのキーが変更されているため、type パラメータのポインタを直接変更することは現実的ではありません。それ自体は参照なので、キーを指して変更することが可能です。

証明いくつかの簡単なコードで証明できます

コード 1: 関数は key が指すデータを変更できます

let func = obj => { obj.name = 'Dosk' };
let obj = {name : 'Alxw'};
console.log(obj); //{ name: 'Alxw' }
func(obj)
console.log(obj); //{ name: 'Dosk' }

コード 2: 関数は obj

let func = obj => { obj = {} };
let obj = {name : 'Alxw'};
console.log(obj); //{ name: 'Alxw' }
func(obj)
console.log(obj); //{ name: 'Alxw' }
を変更できません

コード 3:内部 obj と外部 = == の結果は等しい

let def = {name : 'Alxw'};
let func = obj => { console.log(obj === def) };
func(def); //true

つまり、3 番目のコードに何か問題がある可能性があります。obj は def のコピーであるのに、なぜ === 演算が true になるのでしょうか。 === 演算はオブジェクトのメモリ内のアドレスを比較するという意味ではないでしょうか。コピーの場合は false になるはずです。

それでは、Google V8 のソースコードに戻ってこれを見てみましょう。

Google V8の詳細ソースコードの厳密に等しいオペレーションコード部分を見てみましょう:

bool Object::StrictEquals(Object* that) {
 if (this->IsNumber()) {
  if (!that->IsNumber()) return false;
  return NumberEquals(this, that);
 } else if (this->IsString()) {
  if (!that->IsString()) return false;
  return String::cast(this)->Equals(String::cast(that));
 } else if (this->IsSimd128Value()) {
  if (!that->IsSimd128Value()) return false;
  return Simd128Value::cast(this)->Equals(Simd128Value::cast(that));
 }
 return this == that;
}

理論的には、defとobjが異なる場合は最後のケースであるはずです。オブジェクトの場合は false が返されるはずです。そうです。これは上記の内容を覆しませんか?実は、いいえ、無視されていることが 1 つあります。つまり、オブジェクトを内部でインスタンス化する場合、Google V8 自体は動的インスタンス化であり、コンパイル言語では動的インスタンス化はヒープ メモリ上でのみ実行できる、つまりポインタのみが実行できることがわかっています。引用します。この結論の証明には Local や Han

dl

e などの class の実装が必要になるので、簡単な証明方法としては、search という方法があります。 code>Object::StrictEquals Code> は、アドレス取得操作なしで直接渡されます。
しかし、値によって渡される変数には Object への参照が含まれているため、理論的には Object も変更できるのに、なぜ 3 番目のコードを変更できないのかと疑問に思う人もいるかもしれません。 Object::StrictEquals 的地方都是直接传入而没有取地址操作。

不过有人会问,既然是值传递的变量包含 Object 的引用,理论上也能够修改 Object 才对,为什么第三段代码不能修改呢?

很简单的道理,因为我们在 Javascript 语言逻辑层次上的所谓的操作,只不过是在调用 Google V8 的实例方的法而已,根本不可能操作到这一地步(当然,潜在的 BUG 不算的 -。-)

重新定义

我觉得到这里可以给 call by sharing 重新解释一下了:

的确,传递的时候是值传递,但是内容包含了 Object 的指针,而且不能够修改这个指针,他是多个变量共享的。

另一种简单的证明

来来来,看源码

V8_DEPRECATE_SOON("Use maybe version",
         Local<Value> Call(Local<Value> recv, int argc,
                  Local<Value> argv[]));
V8_WARN_UNUSED_RESULT MaybeLocal<Value> Call(Local<Context> context,
                       Local<Value> recv, int argc,
                       Local<Value> argv[]);

上面的是即将弃用的接口,碰巧我看到的这个版本代码包含大量的这种即将弃用的代码,看看就好。重点是第二个接口,是函数的唯一的调用的接口。里面的 Local<value></value> 最终会调用 C++ 的位复制,所以可以简单的证明就是值传递。

可能是重点

别忘了,我们定义的的变量都是类似 Handle<object> </object>

理由は非常に簡単で、JavaScript言語の論理レベルでのいわゆる操作はGoogle V8のインスタンスメソッドを呼び出しているだけであり、ここまでの操作は不可能だからです(もちろん潜在的なバグは含まれていません) -. -)

再定義

🎜🎜ここで共有することで呼び出しを再説明できると思います:🎜🎜確かに、渡すときは値によって渡されますが、コンテンツにはオブジェクトのポインタが含まれており、 not このポインタは変更でき、複数の変数で共有されます。 🎜🎜🎜🎜もう 1 つの簡単な証明🎜🎜🎜🎜さあ、ソース コードを見てください🎜rrreee🎜上記は、間もなく非推奨になる予定の インターフェース🎜、たまたま私が見たこのバージョンのコードには、廃止予定のコードが多数含まれています。ちょっと見てください。焦点は、関数の唯一の呼び出しインターフェイスである 2 番目のインターフェイスにあります。内部の Local<value></value> は最終的に C++ のビット コピーを呼び出すため、それが値の転送であることを簡単に証明できます。 🎜🎜🎜🎜おそらくこれが重要なポイントです🎜🎜🎜🎜忘れないでください、私たちが定義する変数はすべて Handle<object> </object> の形式であるため、それらの間のオブジェクトは共有されます。 Javascript の変数は Object のインスタンスを直接参照しません!!!🎜🎜🎜🎜最後のもの🎜🎜🎜

要するに、理解しにくい、あるいは間違いが含まれているかもしれませんが、JavaScript 言語レベルで特性を判断できることが重要です。

上記は、編集者があなたに紹介した Javascript の関数呼び出しです。ご質問があれば、メッセージを残してください。編集者がすぐに返信します。スクリプト ハウス Web サイトをサポートしてくださった皆様にも感謝いたします。

以上がJavaScriptの関数呼び出しのコード詳細の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptのデータ型:ブラウザとNodejsに違いはありますか?JavaScriptのデータ型:ブラウザとNodejsに違いはありますか?May 14, 2025 am 12:15 AM

JavaScriptコアデータ型は、ブラウザとnode.jsで一貫していますが、余分なタイプとは異なる方法で処理されます。 1)グローバルオブジェクトはブラウザのウィンドウであり、node.jsのグローバルです2)バイナリデータの処理に使用されるNode.jsの一意のバッファオブジェクト。 3)パフォーマンスと時間の処理にも違いがあり、環境に従ってコードを調整する必要があります。

JavaScriptコメント://および / * *を使用するためのガイドJavaScriptコメント://および / * *を使用するためのガイドMay 13, 2025 pm 03:49 PM

javascriptusestwotypesofcomments:シングルライン(//)およびマルチライン(//)

Python vs. JavaScript:開発者の比較分析Python vs. JavaScript:開発者の比較分析May 09, 2025 am 12:22 AM

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

Python vs. JavaScript:ジョブに適したツールを選択するPython vs. JavaScript:ジョブに適したツールを選択するMay 08, 2025 am 12:10 AM

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScript:それぞれの強みを理解するPythonとJavaScript:それぞれの強みを理解するMay 06, 2025 am 12:15 AM

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

JavaScriptのコア:CまたはCの上に構築されていますか?JavaScriptのコア:CまたはCの上に構築されていますか?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptアプリケーション:フロントエンドからバックエンドまでJavaScriptアプリケーション:フロントエンドからバックエンドまでMay 04, 2025 am 12:12 AM

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール