- 2010-05-21 (金) 3:30
- プログラミング


jQuery1.4 から追加された jQuery.noop ですが、StackTrace で解説を書いているときに、とても困りました。
うーん、いいサンプルが思いつかない。。。
実装がこうなっていたからです。
noop: function() {},
本家のサイトには、こう書いてあります。
You can use this empty function when you wish to pass around a function that will do nothing.
This is useful for plugin authors who offer optional callbacks; in the case that no callback is given, something like jQuery.noop could execute.
まあ、意訳すると
「何もしないっていう関数が必要なときに使ってね。プラグイン作るとき便利かも。例えばさ、オプションのコールバックの引数が与えられなかった場合でも、jQuery.noop ってしておけばいいじゃん。」
*意訳です。
でも、コールバックを引数に取るような実装をする場合って、何が渡されるか分からない(関数ではないかもしれない)ので、初期値として jQuery.noop を設定しても、コールバックを呼び出すところで殆どの場合はこうするよね。
// 関数だったらコールバックを実行 if(jQuery.isFunction(callback)) { callback.call(thisObject, arg1); } // 関数じゃない場合は何もしない
まあ、コールバック関数を設定するところで、先に判別してもいいんですけど、何か弱い。うーん。困った。全ての解説にわかりやすいサンプルをつけるというのが、jQuery API 日本語リファレンス [ jQuery ] – StackTrace のモットーなのに。(自分で決めたんですが)
jQuery 内部での使い方
じゃあ、jQuery の中ではどのような使い方をしているのか探してみました。
jQuery1.4.2 のソースコードには、4箇所しか現れません。
Line 2024
special: {
ready: {
// Make sure the ready event is setup
setup: jQuery.bindReady,
teardown: jQuery.noop
},
...
readyイベント(DOMの読み込みが完了したときに呼び出されるイベント)の teardown メソッドに指定されています。その通り teardown では何もする必要がありません。また、何も返さないことにより(undefined)、呼び出し元で removeEvent されないようにします。
Line 5174
if ( xhr ) { xhr.onreadystatechange = jQuery.noop; }
このコードブロックは、XMLHttpRequestの通信が abort された時に実行されます。
abort (中止)されたので、XMLHttpRequestオブジェクトがある場合は、それ以上 onreadystatechange イベントに対して何もしなくてよいので、空の関数を設定しています。
Line 5180
if ( xhr ) { xhr.onreadystatechange = jQuery.noop; }
このコードブロックは、XMLHttpRequestの通信が終了したか、タイムアウトした時に実行されます。
上記と同様に、通信が終了したので、何もしなくてよいわけです。
Line 6047
jQuery.offset = {
initialize: function() {
...
jQuery.offset.initialize = jQuery.noop;
},
...
jQuery.offset.initialize が呼び出された最後で、自分自身に空のメソッドを代入しています。
こうすることにより、jQuery.offset.initialize は一度しか実行されなくなります。
initialize (初期化)なので、まさに、一度実行したら、もう何もしなくてよいわけです。
jQuery.noop をどう使うか
この事から、jQuery.noop は、「何もしない」というセマンティクスを表すために用意されたメソッドだと思います。function(){} と書くよりも、jQuery.noop (何もしない)という方が分かりやすいですよね。”noop” は”no operation” (何もしない) の略ですから。
上記のように、一度実行したらその後何もしないメソッドや、”内部的に実装する” コールバックの初期値として何もしないと設定したり、セマンティクスから考えると使い方がいろいろ出てくると思います。
他には What real purpose does $.noop() serve in jQuery 1.4? にあるように、これを使えば、function のインスタンスをいちいち生成しないので、メモリが節約できる。という意見もあります。
リファレンスはさらっとこう書きました。jQuery.noop [ jQuery ] – StackTrace
というとことで、no operation (何もしない) というところで使ってみてください。
というか、いい使い方があれば教えてください。
- Newer: jQuery UI のサーバは nginx を使っていた
- Older: YUI Compressor GUI 1.1.0 リリース

ikemasa