コアポイント
- JavaScriptの閉鎖は、親機能が実行されたとしても、親機能が実行された場合でも、これらの変数を覚えて操作できる関数です。
- コールバック関数は、他の関数にパラメーターとして渡される関数であり、外部関数内で実行され、実行を遅らせるか、非同期操作の順序を維持する方法を提供します。
- execute now関数式(iife)は、変数の範囲を保護し、グローバルな範囲汚染を防ぐために定義の直後に実行される関数です。
- 閉鎖は、スコープに保存されている変数を読み取りおよび更新することができ、これらの更新は、これらの変数にアクセスする任意の閉鎖に表示されます。
- IIFEを使用すると、関数内でプライベートスコープの作成が役立ち、変数の管理を改善し、これらの変数への外部アクセスを防ぐことができます。
- これらの概念(クロージャー、コールバック関数、IIFE)の組み合わせは、機能性をカプセル化し、グローバルな範囲汚染を回避するために、簡潔で効率的で安全なJavaScriptコードを作成するための強力なツールを提供します。
クロージング JavaScriptでは、閉鎖とは、親関数が
に戻った場合でも、親スコープ変数への参照を保持する関数です。実際には、このチュートリアルの最初の部分の変数スコープセクションで学んだように、関数に参照またはアクセスできるため、任意の関数は閉鎖と見なすことができます。
独自の関数範囲の変数とパラメーター外部(親)関数の変数とパラメーター
-
グローバルスコープ
- の変数
- したがって、閉鎖を知らずに使用した可能性があります。しかし、私たちの目標は、それらを使用することだけではなく、それらを理解することです。それらがどのように機能するか理解できない場合、それらを正しく使用することはできません。これを行うために、上記の閉鎖定義を3つの理解しやすいキーポイントに分類します。
- ポイント1: 現在の関数の外側に定義された変数を参照できます。
このコードの例では、関数は、囲まれた(親)
関数の変数とパラメーターを指します。その結果、と呼ばれると、
は、以前の変数とパラメーターを使用して「フランスのパリにいる」という正常に出力されます。function setLocation(city) { var country = "France"; function printLocation() { console.log("You are in " + city + ", " + country); } printLocation(); } setLocation("Paris"); // 输出:You are in Paris, France
ポイント2:printLocation()
内側関数は、外部関数が戻った後でも外部関数で定義された変数を参照できます。 setLocation()
country
function setLocation(city) { var country = "France"; function printLocation() { console.log("You are in " + city + ", " + country); } printLocation(); } setLocation("Paris"); // 输出:You are in Paris, Franceこれは、すぐに呼び出すのではなく、
printLocation()
関数の外側のを除いて、最初の例とほぼ同じです。したがって、setLocation()
の値は内部currentLocation
関数です。 printLocation()
このように思い出させる場合、
見たように、currentLocation
はその語彙範囲外で実行されます。 alert(currentLocation);
は消えているようですが、
function setLocation(city) { var country = "France"; function printLocation() { console.log("You are in " + city + ", " + country); } return printLocation; } var currentLocation = setLocation("Paris"); currentLocation(); // 输出:You are in Paris, France)およびパラメーター(
)にアクセスして「覚えている」ことができます。 printLocation()
setLocation()
閉鎖(内部関数)は、字句範囲外で実行されている場合でも、その周りの範囲(外部関数)を覚えることができます。したがって、プログラムのいつでも後で呼び出すことができます。 printLocation()
country
ポイント3:city
内側関数は、値ではなく、参照によって外部関数である変数を保存します。
ここで2つのクロージャーを含むオブジェクト(と
)を返します。function printLocation () { console.log("You are in " + city + ", " + country); }
およびcityLocation()
の現在の値が更新されます。 2回目の呼び出しの場合、デフォルトの「パリ」の代わりに、get()
- "sydney"の更新(現在の)値を出力します。 set()
したがって、閉鎖は保存された変数を読み取り、更新することができ、これらの更新はそれらにアクセスする任意の閉鎖に表示されます。これは、閉鎖がその値をコピーする代わりに、その外部変数city
への参照を保存することを意味します。これを知らないことは、「すぐに機能式(IIFE)」セクションに表示されるように、これを知らないことがいくつかの発見が困難な論理エラーにつながる可能性があるためです。 get()
city
の興味深い機能は、閉鎖の変数が自動的に隠されていることです。閉鎖は、直接アクセスする方法を提供することなく、囲まれた変数にデータを保存します。これらの変数を変更する唯一の方法は、間接的にそれらにアクセスすることです。たとえば、最後のコードスニペットでは、set()
およびmyLocation.get()
閉鎖を使用して変数を間接的に変更できることがわかります。 city
ご覧のとおり、閉鎖の周りに神秘的または深遠なものは何もありません。
callback関数get()
set()
city
JavaScriptでは、機能は一流の市民です。この事実の結果の1つは、関数が他の機能への引数として渡されるか、他の機能によって返される可能性があることです。
コールバック関数には、毎日多くの用途があります。そのうちの1つは、ブラウザウィンドウオブジェクトの
およびsetTimeout()
メソッドを使用する場合です。これらのメソッドは、コールバック関数を受け入れて実行します。
setInterval()
function setLocation(city) { var country = "France"; function printLocation() { console.log("You are in " + city + ", " + country); } printLocation(); } setLocation("Paris"); // 输出:You are in Paris, France
高次関数とコールバック関数がどのように機能するかを理解する最も簡単な方法は、独自の高次関数とコールバック関数を作成することです。それでは、今すぐ作成しましょう:
function setLocation(city) { var country = "France"; function printLocation() { console.log("You are in " + city + ", " + country); } return printLocation; } var currentLocation = setLocation("Paris"); currentLocation(); // 输出:You are in Paris, France
ここでは、3つのパラメーターを受け入れる関数
function printLocation () { console.log("You are in " + city + ", " + country); }を作成します。これは、最初の名前と姓の2つ、コールバック関数用に1つを受け入れます。次に、
ステートメントの後、実際のコールバック関数、つまりfullName()
の下に定義されているconsole.log()
関数をトリガーする関数呼び出しを配置します。最後に、ここでfullName()
を呼び出しますgreeting()
ここで、fullName()
は変数として渡されます - ブラケットなしgreeting()
- - すぐに実行することは望まないので、。 fullName()
コールバック関数は、既存の機能(前の例に示すように)または匿名関数を作成する場合があります。
コールバック関数は、汎用性と再利用性を提供するために、JavaScriptライブラリで広く使用されています。ライブラリメソッドの簡単なカスタマイズおよび/または拡張を可能にします。さらに、コードはメンテナンスが簡単で、より簡潔で読みやすいです。コールバック関数は、不必要な重複コードパターンをより抽象的/一般的な関数に変換する必要がある場合に役立ちます。
function cityLocation() { var city = "Paris"; return { get: function() { console.log(city); }, set: function(newCity) { city = newCity; } }; } var myLocation = cityLocation(); myLocation.get(); // 输出:Paris myLocation.set('Sydney'); myLocation.get(); // 输出:Sydney
2つの関数が必要だとします。1つは公開された記事情報を印刷し、もう1つは送信されたメッセージ情報を印刷するものです。それらを作成しましたが、ロジックの一部が両方の機能で繰り返されていることに気付きました。同じコードを1つの場所に置くことは不要であり、維持するのが難しいことを知っています。それで、解決策は何ですか?次の例で説明しましょう:
function setLocation(city) { var country = "France"; function printLocation() { console.log("You are in " + city + ", " + country); } printLocation(); } setLocation("Paris"); // 输出:You are in Paris, Franceここで行うことは、重複したコードパターン(
およびconsole.log(item)
)を別の一般関数(var date = new Date()
)に配置し、特定のデータのみを他の機能に保持することです。これらは、関数がコールバック関数になります。このようにして、同じ関数を使用して、メッセージ、記事、本、雑誌など、さまざまな関連するものに関する関連情報を印刷できます。あなたがする必要がある唯一のことは、各タイプの特別なコールバック関数を作成し、それをpublish()
関数の引数として渡すことです。 publish()
function式式をすぐに実行(iife)
関数式をすぐに実行するか、iife(「ify」と発音)は、作成後すぐに実行される関数式(名前または匿名)です。このモードにはわずかに異なる構文バリアントが2つあります。
通常の関数をiifeに変換するには、2つのステップを実行する必要があります。
function setLocation(city) { var country = "France"; function printLocation() { console.log("You are in " + city + ", " + country); } return printLocation; } var currentLocation = setLocation("Paris"); currentLocation(); // 输出:You are in Paris, France
ブラケットに関数全体を囲む必要があります。名前が示すように、Iifeは関数定義ではなく関数式でなければなりません。したがって、括弧を囲む目的は、関数の定義を式に変換することです。これは、JavaScriptでは、括弧内のすべてが式として扱われるためです。
- 最後にブラケットを追加する(バリアント1)、またはブレースを閉じた後(バリアント2)、関数がすぐに実行される必要があります。
- 覚えておくべき3つのこと:
第二に、Iifeはセミコロンで終了します。そうしないと、コードが適切に機能しない場合があります。
第三に、次の例に示すように、パラメーターをiifeに渡すことができます(結局、それは関数です):
function printLocation () { console.log("You are in " + city + ", " + country); }
グローバルオブジェクトをiifeのパラメーターとして渡すことは、ブラウザ環境から独立したコードを使用することなく、関数内にアクセスするための一般的なパターンです。次のコードは、使用しているプラットフォームに関係なく、グローバルオブジェクトを参照する変数
を作成します。このコードは、ブラウザ(グローバルオブジェクトは
)またはnode.js環境(グローバルオブジェクトを参照するために特別な変数function cityLocation() { var city = "Paris"; return { get: function() { console.log(city); }, set: function(newCity) { city = newCity; } }; } var myLocation = cityLocation(); myLocation.get(); // 输出:Paris myLocation.set('Sydney'); myLocation.get(); // 输出:Sydneyを使用しています)で動作します。
window
Iifeの大きな利点の1つは、それを使用する場合、一時的な変数でグローバル空間を汚染することを心配する必要がないことです。 Iife内で定義するすべての変数はローカルになります。チェックしてみましょう:global
function showMessage(message) { setTimeout(function() { alert(message); }, 3000); } showMessage('Function called 3 seconds ago');ステートメントは正常に機能しますが、変数がIIFEによる局所変数になるため、2番目のステートメントは失敗します。
window
閉鎖は外部変数への参照を保持しているため、最新/更新された値を返すことがすでにわかっています。それで、あなたは次の例の出力は何だと思いますか? global
function setLocation(city) { var country = "France"; function printLocation() { console.log("You are in " + city + ", " + country); } printLocation(); } setLocation("Paris"); // 输出:You are in Paris, France
果物の名前は、秒間に1つずつ印刷されると予想される場合があります。ただし、実際、出力は「未定義」の4倍です。それで、問題は何ですか?
問題は、ステートメントでは、ループの各反復に対してconsole.log()
の値が4に等しいことです。また、i
配列のインデックス4には何もないため、出力は「未定義」です。 (JavaScriptでは、配列のインデックスが0から始まることを忘れないでください。)fruits
が4に等しい場合、ループは終了します。 i
この問題を解決するには、ループによって作成された各関数の新しい範囲を提供する必要があります。これを行います。Iifeの
i
setTimeout()
同じタスクを実行する次のバリアントを使用することもできます。
i
function setLocation(city) { var country = "France"; function printLocation() { console.log("You are in " + city + ", " + country); } return printLocation; } var currentLocation = setLocation("Paris"); currentLocation(); // 输出:You are in Paris, France結論
function printLocation () { console.log("You are in " + city + ", " + country); }
このチュートリアルの目的は、これらの基本概念を、可能な限り明確かつ簡潔に紹介することです。これは、原則またはルールの単純なセットとしてです。それらをよく理解することは、成功した効率的なJavaScript開発者になるための鍵です。
ここで説明したトピックを詳細かつ詳細に説明するために、カイルシンプソンの「You Do n't not JS:Scopes and Crocures」を読むことをお勧めします。
(後続のコンテンツ、すなわちFAQパーツは、記事の長さのために省略されています。必要に応じて、具体的な質問をしてください。)
以上がJavaScriptの閉鎖、コールバック、IIFEの分解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

それで、あなたはここで、Ajaxと呼ばれるこのことについてすべてを学ぶ準備ができています。しかし、それは正確には何ですか? Ajaxという用語は、動的でインタラクティブなWebコンテンツを作成するために使用されるテクノロジーのゆるいグループ化を指します。 Ajaxという用語は、もともとJesse Jによって造られました

10の楽しいjQueryゲームプラグインして、あなたのウェブサイトをより魅力的にし、ユーザーの粘着性を高めます! Flashは依然としてカジュアルなWebゲームを開発するのに最適なソフトウェアですが、jQueryは驚くべき効果を生み出すこともできます。また、純粋なアクションフラッシュゲームに匹敵するものではありませんが、場合によってはブラウザで予期せぬ楽しみもできます。 jquery tic toeゲーム ゲームプログラミングの「Hello World」には、JQueryバージョンがあります。 ソースコード jQueryクレイジーワードコンポジションゲーム これは空白のゲームであり、単語の文脈を知らないために奇妙な結果を生み出すことができます。 ソースコード jquery鉱山の掃引ゲーム

このチュートリアルでは、jQueryを使用して魅惑的な視差の背景効果を作成する方法を示しています。 見事な視覚的な深さを作成するレイヤー画像を備えたヘッダーバナーを構築します。 更新されたプラグインは、jQuery 1.6.4以降で動作します。 ダウンロードしてください

記事では、JavaScriptライブラリの作成、公開、および維持について説明し、計画、開発、テスト、ドキュメント、およびプロモーション戦略に焦点を当てています。

この記事では、ブラウザでJavaScriptのパフォーマンスを最適化するための戦略について説明し、実行時間の短縮、ページの負荷速度への影響を最小限に抑えることに焦点を当てています。

この記事では、JQueryとAjaxを使用して5秒ごとにDivのコンテンツを自動的に更新する方法を示しています。 この例は、RSSフィードからの最新のブログ投稿と、最後の更新タイムスタンプを取得して表示します。 読み込み画像はオプションです

Matter.jsは、JavaScriptで書かれた2D Rigid Body Physics Engineです。このライブラリは、ブラウザで2D物理学を簡単にシミュレートするのに役立ちます。剛体を作成し、質量、面積、密度などの物理的特性を割り当てる機能など、多くの機能を提供します。また、重力摩擦など、さまざまな種類の衝突や力をシミュレートすることもできます。 Matter.jsは、すべての主流ブラウザをサポートしています。さらに、タッチを検出し、応答性が高いため、モバイルデバイスに適しています。これらの機能はすべて、物理ベースの2Dゲームまたはシミュレーションを簡単に作成できるため、エンジンの使用方法を学ぶために時間をかける価値があります。このチュートリアルでは、このライブラリのインストールや使用法を含むこのライブラリの基本を取り上げ、


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

WebStorm Mac版
便利なJavaScript開発ツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

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

Dreamweaver Mac版
ビジュアル Web 開発ツール

ホットトピック



