JavaScript の binding() 関数を理解する
共有:
bind() メソッドは新しい関数を作成します, この新しい関数が呼び出されるとき、その this 値は、bind() に渡される最初のパラメータであり、そのパラメータは、bind() の他のパラメータとその元のパラメータです。
構文は次のとおりです。
fun.bind(thisArg[, arg1[, arg2[, ...]]])
thisArg バインドされた関数が呼び出されるとき、このパラメーターは、実行時の元の関数の this ポインターとして使用されます。 new 演算子を使用してバインドされた関数を呼び出す場合、このパラメーターは効果がありません。
arg1, arg2, … (オプション) バインドされた関数が呼び出されるとき、これらのパラメーターとバインドされた関数自体のパラメーターが、順番に実行されるときに元の関数のパラメーターとして使用されます。
パラメータ
バインドの最初のパラメータは、言うまでもなく、元の関数の実行時にこのポインタとして使用されます。2 番目の開始パラメータは、バインドされた関数が呼び出されると、これらのパラメータとバインドされた関数自体のパラメータが、順番に実行されるときに元の関数のパラメータとして使用されます。どのように理解すればよいでしょうか?
function fn(a, b, c) { return a + b + c; } var _fn = fn.bind(null, 10); var ans = _fn(20, 30); // 60
fn 関数には 3 つのパラメータが必要です。_fn 関数はデフォルトの最初のパラメータとして 10 を使用するため、2 つのパラメータだけを渡す必要があります。誤って 3 つのパラメータを渡してしまっても、心配する必要はありません。最初の 2 つが取得されます。
function fn(a, b, c) { return a + b + c; } var _fn = fn.bind(null, 10); var ans = _fn(20, 30, 40); // 60
これは何の役に立つのですか?一部の関数の最初のいくつかのパラメータが「デフォルト」になっている場合は、bind を使用して新しい関数を返すことができます。言い換えれば、bind() を使用すると、関数が事前に設定された初期パラメータを持つことができます。これらのパラメーター (存在する場合) は、bind() の 2 番目のパラメーターとしてこれに続き、ターゲット関数のパラメーター リストの先頭に挿入され、バインドされた関数に渡されるパラメーターが続きます。
function list() { return Array.prototype.slice.call(arguments); } var list1 = list(1, 2, 3); // [1, 2, 3] // Create a function with a preset leading argument var leadingThirtysevenList = list.bind(undefined, 37); var list2 = leadingThirtysevenList(); // [37] var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]
new
bind によって返された結果は依然として関数です。関数の場合は、new 演算子によって呼び出すことができます。では、結果はどうなるでしょうか。 ?この仕様では、new 演算子を使用してバインドされた関数を呼び出す場合、バインドの最初のパラメーターが無効であることが明確にされています。
function Person(name, age) { this.name = name; this.age = age; } var _Person = Person.bind({}); var p = new _Person('hanzichi', 30); // Person {name: "hanzichi", age: 30}
通常、この方法では使用しませんが、バインド ポリフィル ( http://caniuse.com/#search=bind ) を作成する場合は、 new を使用して呼び出すことを検討する必要があります。 。
デフォルト値を設定することもできます (前のセクションを参照)。最初に提供されたパラメーターは引き続きコンストラクター呼び出しの先頭に追加されます。
function Person(name, age) { this.name = name; this.age = age; } var _Person = Person.bind(null, 'hanzichi'); var p = new _Person(30); // Person {name: "hanzichi", age: 30}
setTimeout を使用する場合
このポインタを失いやすいのはどんなときですか? setTimeout はシーンなので、これをウィンドウに指定するのは簡単ですが、もちろん、setInterval についても同じことが当てはまります。オブジェクトを参照するために this を必要とするオブジェクトのメソッドを使用する場合、オブジェクトの使用を継続するには this をコールバック関数に明示的にバインドする必要がある場合があります。
var canvas = { render: function() { this.update(); this.draw(); }, update: function() { // ... }, draw: function() { // ... } }; window.setInterval(canvas.render, 1000 / 60);
キャンバスを使用して特殊効果を作成したり、ゲームを作成したりするときにも、同様の問題がよく発生します。上記のコードには問題があり、render メソッド内のこれは実際にはウィンドウを指しています。バインドを使用してこれをコールバック関数に明示的にバインドし、オブジェクトを引き続き使用できるようにします。
window.setInterval(canvas.render.bind(canvas), 1000);
同様の状況は、dom のイベント監視であり、注意しないと、これが dom 要素を指す可能性があります。 https://github.com/hanzichi/hanzichi.github.io/blob/master/2016/bigrender/js/bigrender.js#L179-L184 より前に bigrender で作業するときに記述されたコードのこの部分を参照できます。
#tip
bind では、いくつかの興味深いこともできます。
一般的に、配列のような配列を配列に変換するには、スライスを使用します (ie9- はサポートしていません)。別の同様の例については、#14
var slice = Array.prototype.slice; // slice.apply(arguments); // slice(arguments, 1); bind 能让调用变的更加简单。 // same as "slice" in the previous example var unboundSlice = Array.prototype.slice; var slice = Function.prototype.call.bind(unboundSlice); // ... slice(arguments); // slice(arguments, 1);
を参照してください。たとえば、複数のノードにイベントを追加したい場合、もちろん for ループには問題はありません。また、forEach メソッドを「盗用」することもできます。
Array.prototype.forEach.call(document.querySelectorAll('input[type="button"]'), function(el){ el.addEventListener('click', fn); });
さらに、bind を使用して関数をより適切にカプセル化できます:
var unboundForEach = Array.prototype.forEach , forEach = Function.prototype.call.bind(unboundForEach); forEach(document.querySelectorAll('input[type="button"]'), function (el) { el.addEventListener('click', fn); });
同様に、x.y(z) を y(x,z) の形式に変更できます:
var obj = { num: 10, getCount: function() { return this.num; } }; var unboundBind = Function.prototype.bind , bind = Function.prototype.call.bind(unboundBind); var getCount = bind(obj.getCount, obj); console.log(getCount()); // 10
もう一つ栗をあげましょう。コンソールに 1 ~ 5 を毎秒出力するのは、クロージャを調べるときによくある問題のようです。
for(var i = 1; i <= 5; i++) { !function(i) { setTimeout(function() { console.log(i); }, i * 1000); }(i); }
ES6 では let を使用できます:
for(let i = 1; i <= 5; i++) { setTimeout(function() { console.log(i); }, i * 1000); }
バインドを使用してパフォーマンスを即座に向上させることもできます:
for(var i = 1; i <= 5; i++) { setTimeout(console.log.bind(console, i), i * 1000); }
推奨チュートリアル: 「js 基本チュートリアル#」 ## 》
以上がJavaScriptのbind()関数について議論するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

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

PhpStorm Mac バージョン
最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

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

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

ドリームウィーバー CS6
ビジュアル Web 開発ツール
