関数バインディングは、JavaScript を使い始めるときにおそらく最も注意を払わないものですが、このコンテキストを別の関数で維持する方法の解決策が必要であることに気づいたとき、本当に必要なのは Function.prototype です。 bind() を実行しますが、まだこれに気づいていないかもしれません。
この問題に初めて遭遇したときは、コンテキストを変更した後も引き続き参照できるように、これを変数に設定したくなるかもしれません。多くの人は変数名として self、_this、または context を使用することを選択します (それを使用する人もいます)。これらの方法はすべて便利であり、もちろん問題はありません。しかし、より優れた、より専門的な方法があります。
私たちが解決する必要がある本当の問題は何ですか?
次のコード例では、コンテキストを変数に正当にキャッシュできます:
var myObj = { specialFunction: function () { }, anotherSpecialFunction: function () { }, getAsyncData: function (cb) { cb(); }, render: function () { var that = this; this.getAsyncData(function () { that.specialFunction(); that.anotherSpecialFunction(); }); } }; myObj.render();
単純に this.specialFunction() を使用してメソッドを呼び出すと、次のエラーが表示されます:
Uncaught TypeError: オブジェクト [オブジェクト グローバル] にはメソッド 'specialFunction' がありません
コールバック関数を実行するには、myObj オブジェクト コンテキストへの参照を保持する必要があります。 that.specialFunction() を呼び出すと、スコープのコンテキストを維持し、関数を正しく実行できます。 ただし、Function.prototype.bind() を使用するより簡単でクリーンな方法があります:
render: function () { this.getAsyncData(function () { this.specialFunction(); this.anotherSpecialFunction(); }.bind(this)); }
今何をしたの?
.bind() は関数を作成します。この関数が呼び出されるとき、その this キーワードは渡された値に設定されます (ここでは、bind() を呼び出すときに渡されるパラメータを指します)。したがって、必要なコンテキストである this (実際には myObj) を .bind() 関数に渡します。その後、コールバック関数が実行されると、これは myObj オブジェクトを指します。
Function.prototype.bind() が内部的にどのようなもので、どのように機能するかを知りたい場合は、非常に簡単な例を次に示します。
Function.prototype.bind = function (scope) { var fn = this; return function () { return fn.apply(scope); }; }
非常に単純な使用例もあります:
var foo = { x: 3 } var bar = function(){ console.log(this.x); } bar(); // undefined var boundFunc = bar.bind(foo); boundFunc(); // 3
新しい関数を作成し、それが実行されると、this は foo に設定されます。bar() を呼び出したときのようなグローバル スコープではありません。
ブラウザのサポート
ブラウザのバージョンのサポート
クロム 7
Firefox (Gecko) 4.0 (2)
Internet Explorer 9
オペラ 11.60
サファリ 5.1.4
ご覧のとおり、Function.prototype.bind は残念ながら IE8 以前ではサポートされていないため、フォールバックがない場合は問題が発生する可能性があります。
幸いなことに、Mozilla Developer Network (優れたリソース ライブラリ) は、.bind() メソッド自体を実装していないブラウザに確実な代替手段を提供します。
if (!Function.prototype.bind) { Function.prototype.bind = function (oThis) { if (typeof this !== "function") { // closest thing possible to the ECMAScript 5 internal IsCallable function throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable"); } var aArgs = Array.prototype.slice.call(arguments, 1), fToBind = this, fNOP = function () {}, fBound = function () { return fToBind.apply(this instanceof fNOP && oThis ? this : oThis, aArgs.concat(Array.prototype.slice.call(arguments))); }; fNOP.prototype = this.prototype; fBound.prototype = new fNOP(); return fBound; }; }
適用可能なモード
技術的なポイントを学ぶとき、その概念を徹底的に勉強して理解するだけでなく、それを目の前の仕事に応用できるか、またはそれに近いものがあるかどうかを確認することも役立つことがわかりました。以下の例のいくつかがあなたのコードに適用されるか、直面している問題が解決されることを願っています。
CLICK HANDLERS (クリックハンドラー関数)
用途の 1 つは、クリック イベントを記録する (またはクリック後のアクションを実行する) ことであり、これには次のような情報をオブジェクトに保存する必要がある場合があります。
var logger = { x: 0, updateCount: function(){ this.x++; console.log(this.x); } }
document.querySelector('button').addEventListener('click', function(){ logger.updateCount(); });
次のよりクリーンな方法を使用できます:
document.querySelector('button').addEventListener('click', logger.updateCount.bind(logger));
便利な .bind() 関数を巧みに使用して、新しい関数を作成し、そのスコープをロガー オブジェクトにバインドします。
テンプレート エンジン (Handlebars など) または特に一部の MV* フレームワーク (私の経験から言えば、Backbone.js についてしか話せません) を使用したことがある場合は、テンプレート ノードの使用時に発生する問題。
var myView = { template: '/* 一个包含 <select /> 的模板字符串*/', $el: $('#content'), afterRender: function () { this.$el.find('select').myPlugin(); }, render: function () { this.$el.html(this.template()); this.afterRender(); } } myView.render();
ご存知の方は少ないかもしれませんが、setTimeout() に基づいたちょっとしたハックを使用して問題を解決できます。
DOM ノードがロードされた後に jQuery プラグインを安全にインスタンス化するためにコードを少し書き直してみましょう:
afterRender: function () { this.$el.find('select').myPlugin(); }, render: function () { this.$el.html(this.template()); setTimeout(this.afterRender, 0); }
然而,我们获得的是 函数 .afterRender() 不能找到 的错误信息。
我们接下来要做的,就是将.bind()使用到我们的代码中:
// afterRender: function () { this.$el.find('select').myPlugin(); }, render: function () { this.$el.html(this.template()); setTimeout(this.afterRender.bind(this), 0); } //
以上所述就是本文的全部内容了,希望大家能够喜欢。

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

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

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

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

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

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

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


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

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

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

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

ホットトピック









