検索
ホームページウェブフロントエンド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 までご連絡ください。
CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーションWebサイトからアプリまで:JavaScriptの多様なアプリケーションApr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Python vs. JavaScript:ユースケースとアプリケーションと比較されますPython vs. JavaScript:ユースケースとアプリケーションと比較されますApr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

JavaScript通訳者とコンパイラにおけるC/Cの役割JavaScript通訳者とコンパイラにおけるC/Cの役割Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScriptエンジンの理解:実装の詳細JavaScriptエンジンの理解:実装の詳細Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:学習曲線と使いやすさPython vs. JavaScript:学習曲線と使いやすさApr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

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 プラットフォームで実行できます。

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

DVWA

DVWA

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