JavaScriptのbind()関数について議論する
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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

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

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

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法 はじめに: 技術の継続的な発展により、音声認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音声認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音声認識システムを実装する方法を紹介します。

WebSocketとJavaScript:リアルタイム監視システムを実現するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監視システムは様々な分野で広く利用されています。リアルタイム監視を実現するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実装原理を詳しく説明します。 1.WebSocketテクノロジー

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実装する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実装するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム双方向通信を実現します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

WebSocket と JavaScript を使用してオンライン予約システムを実装する方法 今日のデジタル時代では、ますます多くの企業やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実装することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実装する方法と、具体的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を学びます。この記事では、具体的なコード例を通じて実装プロセスを説明します。私たちは

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判断し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと参照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript は Web 開発で広く使用されているプログラミング言語であり、WebSocket はリアルタイム通信に使用されるネットワーク プロトコルです。 2 つの強力な機能を組み合わせることで、効率的なリアルタイム画像処理システムを構築できます。この記事では、JavaScript と WebSocket を使用してこのシステムを実装する方法と、具体的なコード例を紹介します。まず、リアルタイム画像処理システムの要件と目標を明確にする必要があります。リアルタイムの画像データを収集できるカメラ デバイスがあるとします。
