JavaScript では関数の埋め込みが可能であり、関数をデータとして使用することができ、関数の字句スコープの下で、従来のオブジェクト指向言語と驚くべき違いを生み出すことができます。
まず第一に、JavaScript 関数は動的ではなく字句的にスコープ設定されているため、関数は実行されるスコープではなく、定義されているスコープ内で実行されるため、ネストされた場合は簡単に理解できます。関数とその周囲の関数は同じ字句範囲内で定義されます。たとえば、次のような非常に当たり障りのないコード:
var x = 'グローバル';
関数 f () {
var x = 'ローカル';
関数 g() {
アラート(x); ();
}
f(); // 'local'
f() が呼び出されるとき、スコープ チェーンは呼び出しを含む 2 つの部分で構成されると理解できます。 f オブジェクトの後にグローバル オブジェクトが続きます。このとき、x の値を検索する場合は、まず f の呼び出しオブジェクトから検索され、見つからない場合は後続のグローバル オブジェクト内で x が検索されます。同様に、g は f の入れ子関数であるため、g が呼び出されるとき、スコープ チェーンは、g の呼び出しオブジェクト、f の呼び出しオブジェクト、およびグローバル オブジェクトの 3 つの部分で構成される必要があります。関数 g は x の値を出力するため、最初に g の呼び出しオブジェクトで x の値を検索します。次に、周辺の f 呼び出しオブジェクトで x の定義を検索します。 find x='local' の場合、グローバル オブジェクトの検索を続行する代わりに x を出力します。 x の値が f で定義されていない場合、スコープ チェーンの背後にあるグローバル オブジェクトの検索が続行され、結果はグローバルになります。グローバルオブジェクトで定義されていない場合は、当然未定義になります。
次に、クロージャが外部変数の値をメモリに保存できる理由を理解するのに役立つ、ありふれた例を見てみましょう。
}
var a = [makeFunc(0), makeFunc(1), makeFunc(2)];
alert(a[0]()); >alert( a[1]());
alert(a[2]());
実行結果は 0,1,2 です。字句スコープの厳密な通常の動作。各 makeFunc 呼び出しが完了すると、その呼び出し元オブジェクトはスコープ チェーンから削除され、そのオブジェクトへの参照はなくなり、最終的にはガベージ コレクションを通じて完了します。もっと詳しく言うと、このように理解できます。
makeFunc が呼び出されるたびに、呼び出し元のオブジェクトが作成され、スコープ チェーンに配置されます。関数 makeFunc の場合、呼び出し元オブジェクトには属性が含まれます。関数が実行されると、呼び出し元オブジェクトが作成され、スコープ チェーンに配置されます (注: 関数には x の定義がありません)。無名関数の呼び出しオブジェクトなので、その周囲の関数を参照します。 makeFunc の呼び出しオブジェクト (アクセスします。呼び出し元のオブジェクトには x が含まれているため、x が破棄されると x も破棄されます。保存されません。
}
var a = [ makeFunc()、makeFunc()、makeFunc()];
alert(a[0]());
alert(a[2]()); );
x はグローバル変数であり、実行結果は 0、1、2 ですが、この結果は上記とは多少異なります。次に、スコープチェーンの観点からこの結果の理由を理解します。
同様に、makeFunc が呼び出されるたびに、内部の入れ子関数への参照が返されるため、呼び出し元オブジェクトがスコープ チェーンに作成され、内部の入れ子関数が実行を開始し、入れ子関数の呼び出しオブジェクトを作成します。スコープチェーン。次に、x の値を返します。ここでは、入れ子になった関数の呼び出しオブジェクトには x がなく、その周囲の makeFunc の呼び出しオブジェクトには x がありません。検索できるのはグローバル オブジェクトまでだけです。グローバル オブジェクト内で x の定義が見つかったので、通常どおり実行され、x の値が返され、x が 1 ずつ増分され、ネストされた関数が完了し、呼び出し元のオブジェクトが削除され、makeFunc が完了します。呼び出し元のオブジェクトも削除されますが、呼び出し元のオブジェクトには x がないため、呼び出し元のオブジェクトの破棄は x にまったく影響しません。その結果、グローバル変数 x の値の変更が保存されます。
外部呼び出しオブジェクトへの上記のアクセスは理解を助けるためのものであり、厳密なものではないことに注意してください。ただし、JavaScript が定義するプロパティはスコープ チェーンの一部です。呼び出しオブジェクトはまだ「生きています」。さらに、周辺関数にグローバル オブジェクトへの参照を持つ 2 つ以上の入れ子関数が含まれている場合、これらの入れ子関数はすべて同じグローバル呼び出しオブジェクトを共有し、そのうちの 1 つによるグローバル オブジェクトへの変更は他の関数にも表示されます。の。
JavaScript では、関数は、実行されるコードと、これらのコードが実行されるスコープで構成される複合体です。大まかに言えば、このコードとスコープの複合体をクロージャーと呼ぶことができます。
【終わり】
変数の値を記憶するために呼び出す必要がある関数を記述する必要がある場合があります。したがって、スコープを理解していれば、関数の呼び出しオブジェクトは呼び出し後に維持できないため、ローカル変数を実現するのが難しいことがわかります。上の例のように、グローバル変数でこれを行うことができますが、これは簡単にグローバル変数汚染を引き起こす可能性があります。呼び出し元のオブジェクトは維持できないので、呼び出し元のオブジェクトに値を保存すればよいのではないでしょうか? !したがって、これを行う 1 つの方法は、関数オブジェクト自体のプロパティとともに保存することです。
uniqueID = function () {
if (! argument.callee.id) argument.callee.id = 0;
return argument.callee.id ;
alert(uniqueID()); //0
alert(uniqueID) ()) ; //1
したがって、通常、これを達成するためにクロージャを使用します。次のように:
var id = 0;
return function () {return id }
})();
alert(_uniqueID()) //0
alert(_uniqueID()); ; //1
混乱している人もいるかもしれませんが、関数の実行後に呼び出し元のオブジェクトがスコープ チェーンを削除したということではないでしょうか?呼び出し元のオブジェクトにはあってはならないのです。
はい、呼び出し元のオブジェクトは現在の関数が実行された後に参照を終了しますが、上記の _uniqueID() 呼び出しは直接呼び出された周辺関数ではなく、ネストされた関数が呼び出されたものであることを誤解しないでください。関数のセットには、周囲の関数のスコープ チェーンが含まれます。したがって、呼び出し元のオブジェクトがスコープ チェーンを削除すると、このスコープ チェーン内の他のオブジェクトのプロパティにアクセスして変更できます。
クロージング自体は理解するのが難しいですが、困っている人の助けになれば幸いです。また、資格が限られているため、私の理解が間違っている可能性があります。見つけた場合は修正してください。

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

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

SublimeText3 中国語版
中国語版、とても使いやすい

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ホットトピック









