JS学習ノート-コールバック関数
3792 ワード
この文章は本人がJavaScriptの中で本を読んで理解したことを記録し、記憶を深め、記録を整理し、その後の復習に便利です.
コールバック関数とは?
汎用の関数があると仮定して、複雑な処理を行い、結果は大きなデータ(以下、栗)に戻ります.
関数を定義する
今は
前の栗では、コールバック関数が実行していた文はこうです.
上の文はほとんどのシーンで有効ですが、そのコールバック関数は一回の匿名関数やグローバル関数ではなく、対象の方法です.関数が
解決の方法は以下の通りです.は、このコールバック関数の属するオブジェクトをさらに伝達する.これは は次に上記の方法を修正し、文字列として方法を伝達するので、オブジェクトの名前(以下、栗)を二回入力する必要はない.
コールバック関数とは?
js
において、関数はすべて対象であり、これらはパラメータとして他の関数に渡すことができることを示している.例えば、関数b()
がパラメータとして関数a()
に伝達されると、ある時点で関数a()
が関数b()
を実行または呼び出してもよい.この場合、関数b()
はコールバック関数と呼ばれ、コールバック(以下栗)とも呼ばれる.コールバック関数の例JavaScript
'use strict'; function a(callback) { callback(); } function b() { console.log('hello callback'); } a(b); // b() a()
汎用の関数があると仮定して、複雑な処理を行い、結果は大きなデータ(以下、栗)に戻ります.
上記コード定義関数JavaScript
var findeNodes = function () { var i = 10000, node = [], found; while (i) { i -= 1; node.push(found); } return nodes; }
findNodes()
は、ページをキャプチャするdom tree
と、所望のページ要素配列を返します.関数を定義する
hide()
では、名前の通りページ内のノード(以下栗)を隠す役割を果たします.はい、必要な効果は全部実現しましたが、実現は効果がありません.JavaScript
var hide = function (nodes) { for (var i = 0; i < nodes.length; i += 1) { nodes[i].style.display = 'block'; } } // hide(findeNodes());
hide()
は、findNodes()
によって返された配列ノードを再び循環しなければならないからである.このようなループを回避することができるなら、findNodes()
で選択するだけで、ノードを非表示にすることができるので、より効率的な方法である.しかし、findNodes()
において隠し論理が実現されると、論理結合の検索と修正のために、彼はもはや汎用の関数ではない.このような問題に対する解決方法は、コールバックモードを採用しているので、ノード論理をコールバック関数としてfindNodes()
に伝達し、実行を依頼することができる(以下、クリ).上のコードはJavaScript
// findeNodes() , var findeNodes = function (callback) { var i = 10000, nodes = [], found; while (i) { i -= 1; // if (typof callback === 'function') { callback(); } nodes.push(found); } return found; }
callback
が存在するかどうかを判断しただけです.もし存在するならば、この関数を実行します.ここで、コールバック関数は任意であり、その後のfindeNodes()
は、旧API
以来の元のコードを破壊することなく、以前と同じように使用することができる.今は
hide
の実装が簡単になりました.これはすべてのノードを巡回する必要がないからです.コールバック関数とスコープJavaScript
// var hide = function (nodes) { nodes.style.display = 'none'; } // , findeNodes(hide);
前の栗では、コールバック関数が実行していた文はこうです.
上の文はほとんどのシーンで有効ですが、そのコールバック関数は一回の匿名関数やグローバル関数ではなく、対象の方法です.関数が
callback(parameters)
を使用して属性を引用すると、穴ができます.ピット:JavaScript
// paint(), myapp var myapp = {}; myapp.color = 'green'; myapp.paint = function (nodes) { nodes.style.color = this.color; } // findeNodes() findeNodes(myapp.paint); //
this
は、大域関数であるthis.color
として定義されていません.したがって、オブジェクトのfindeNods()
はthis
を指しています.解決の方法は以下の通りです.
window
関数(以下栗)を修正する必要があります.主に、JavaScript
var findNodes = function (callback, callback_obj) { // ... if (typof callback === 'function') { callback.call(callback_obj, found); } // ... } // findNodes(myapp.paint, myapp);
findNodes()
により、関数の実行時のcall、apply
のポインタが修正される.最後に、文章に何か間違いや疑問があったら、指摘してください.sfの皆さんと励ましましょうJavaScript
var findNodes = function (callback, callback_obj) { // ... if (typof callback === 'string') { callback = callback_obj[callback]; } // ... if (typof callback === 'function') { callback.call(callback_obj, found); } // ... } // findNodes('paint', myapp);