2

jQuery マニュアル自体では、blur関数を次のように示しています。

.blur(handler(eventObject)) // PLUS 2 OTHER VARIATIONS 

したがって、この関数を使用すると、次のような結果が得られます。

<!DOCTYPE html>
<html>
  <head>
    <script src="http://code.jquery.com/jquery-latest.js"></script>
  </head>
  <body>
    <form>
      <input id="target" type="text" value="Field 1" />
      <input type="text" value="Field 2" />
    </form>
    <div id="other">Trigger the handler</div>
    <script>
      $('#target').blur(myhandler(evObj));

      function myhandler(evObj) {
        console.log(evObj);
      };
    </script>
  </body>
</html>

しかし$('#target').blur(myhandler(evObj));、正しい構文ではありませんが、正しい構文は実際には$('#target').blur(myhandler);

したがって、script タグのコード全体は次のようになります。

<script>
  $('#target').blur(myhandler);

  function myhandler(e) {
    console.log(e);
  };
</script>
  1. これはなぜですか?
  2. 誰かが書いてはいけないことをどのように知っているの.blur(handler(eventObject)) でしょうか?
4

2 に答える 2

3

技術的に正しい構文は次のようになります。

blur(handler)

ただし、これは実際にはあまり役に立ちません。ドキュメントを見ている場合は、ハンドラーが受け取る引数を知りたいと思うからです。関数blurを唯一の引数として呼び出すことは明らかであるため、jQuery docs par abus de notation write

blur(handler(eventObj))

ハンドラー関数が1つの引数、イベントオブジェクトを取ることを示します。

于 2013-01-10T12:55:26.023 に答える
1

In JavaScript, functions are just another kind of object. You've stumbled upon the big difference between writing myfunction and myfunction() -- the first is the function object, the second is the return value of that function.

So: $('#target').blur(...) is a method that accepts one object, which must be a function.

When you write $('#target').blur( myhandler(evObj) ), then the myhandler function is not passed to .blur(). Instead, the parentheses that follow it tell JavaScript to evaluate the function (using the argument evObj), and the function's return value is passed to .blur() instead.

If that return value happens to be another function object, then all is good. But if not, you'll get an error.

Usually, however, developers won't declare a separate function myhandler. Instead, we'll use an anonymous function like so:

$('#target').blur(function(evObj) {
    /* do stuff with evObj */
})

That's why the API docs write $('#target').blur( myhandler(evObj) ) -- so developers know what arguments are accepted by the anonymous handler function.

于 2013-01-10T14:25:10.333 に答える