4

こんにちは、JavaScript の知識と理解を深めるために助けが必要であるという質問があります。

私の init メソッド内で、.on メソッドを含むこの特定の行を見てください。ここで、ボタンがクリックされたときに this キーワードを使用して contactForm オブジェクトを参照し、次に .show メソッドを呼び出します。 .

.on( 'click', this.show );

ここでの問題は、show がメソッドである場合、なぜこれを行わないのか、なぜこのようにメソッドを呼び出さないのかということです。

  .on( 'click', this.show() );

JavaScript が init メソッドに出くわした場合、このコードをすべて解析してから、ここのこのセクションに来て、this.show() すぐに実行されるため、show メソッドをすぐに呼び出したくないからです。この機能。しかし、私はそれをしたくありません。対応するボタンがクリックされたという条件でその関数が呼び出されるようにしたいだけです。

show メソッドが次のように記述されthis.showている場合、括弧がないと show メソッドが自動的に実行されなくなりますか?

var contactForm = {
        init: function() {
            $('<button></button>', {    
                text: 'Contact Me!'  
            }) 
                .insertAfter('article:first')
                .on( 'click', this.show() );
        },

        show: function() {
            console.log('showing');
        }

用語の説明が不十分であったり、正確でなかったりした場合は申し訳ありません。簡潔で明確に説明された回答は、非常に高く評価されます。

4

2 に答える 2

8

はい、あなたが説明していることは正しいですが、間違った見方をしています。

かっこのない関数名をある種の特殊なケースと見なしているように見えますが、実際には逆です。

式と演算子の概念を理解することが重要です。

オペレーター

()-たとえば、値を否定する通常の演算子です。演算子は常に値に適用されます:-55-(-5)否定し、再び式(-5)を否定し5ます。

()一方、式を関数としてその左側に呼び出そうとします: expr().

関数は値です

JavaScript の関数は、 value と同じように渡すことができる値です5:

var five = 5;
var returnFive = function() { return 5; };
var five2 = five;
var returnFive2 = returnFive;
alert(five2);
alert(returnFive2());

それ以上のことは何もありません: 関数は単なる値であり、たまたま()それらを「呼び出す」特別な魔法の演算子をサポートしています。

このため、次のいずれかを行うことは完全に有効です

  • show()
  • (show)()
  • ((show))()

など、(expr)単純に に評価されるためexprです。

式の評価

演算子は 1 つまたは複数の値を取り、それを操作して、別の値を生成します。

4            // No operator, expression evaluates to 4
4 + 4        // This expression evaluates to 8
returnFive   // No operator, expression evalutes to the function value
-5           // Unary operator, takes one value, negates it
returnFive() // call operator, executes the function, evaluates to its return value

このことから理解していただきたいのは、関数はそれほど特別なものではなく、showと その一対の括弧の間に本質的な関係がないということです。

show メソッドが次のように記述されthis.showている場合、括弧がないと show メソッドが自動的に実行されなくなりますか?

showはい、いいえ - これは、なしは()個別に処理する特別なケースであることを示唆していますが、そうではありません。「-5 は 5 よりも普通だ」と言っているような-もので、 がないと正の数になります。ただし、それは逆5です。必要に応じて「デフォルト」であり-5、特殊なケースです。と同じことですshow

これをあなたの例に適用する

関数には、on()ある種のコールバック、つまり関数が与えられることが期待されます。を渡す場合show()、何を渡しますか? 評価された式show()。これは何ですか?もちろん、何show()が返ってきても。そのため、はでon()何かを行ったことを「認識」していません。show()show()

もちろん、show()関数自体が関数を返す可能性もあります。これまでに学んだように、関数は5やのような単なる値であり"foo"、受け渡すことができるからです。

その場合、on()関数には、対応するイベントで呼び出される関数が渡されます。

于 2012-10-05T10:49:28.920 に答える
1

あなたは正しいです。括弧を追加せずにメソッド (または実際には任意の関数) を参照すると、ランタイムはそれを関数参照として解釈します。

したがって、あなたの例では、後で実行できるようにshow、関数を関数に効果的に渡しています。on他の関数をパラメータとして受け取ったり、結果として他の関数を返したりする関数は、「高階関数」と呼ばれます。

于 2012-10-05T10:26:07.370 に答える