1

var message = 'Spoon!';
$('#foo').bind('click', function() {
alert(message);
});

message = 'Not in the face!';
$('#bar').bind('click', function() {
alert(message);
});

2つの出力メッセージが同じであるのはなぜですか。'foo'のクロージャー内の最初のメッセージは'Spoon!'を参照していませんか?なぜだめですか?誰か説明してください。チュートリアルの説明がわかりません。

4

4 に答える 4

7

これは、イベント ハンドラーが非同期で起動されるためです。設定しているメッセージ値は最初のスレッドで行われます。

したがって、基本的に、プログラムはコード全体を読み取り、値を に設定して'Spoon!'から、最後に設定した値に設定し'Not in the face!'ます。次に、いずれかのボタンをクリックすると、 message の値が警告されます'Not in the face!'

関数にメッセージを入れてみると、それぞれに異なるメッセージが表示されます。値も非同期に設定するため、これは期待どおりに機能します。

$('#foo').bind('click', function() {
  var message = 'Spoon!';
  alert(message);
});

$('#bar').bind('click', function() {
  var message = 'Not in the face!';
  alert(message);
});
于 2012-04-10T15:17:08.880 に答える
1

fooをクリックすると、 の最後の値が警告さmessageれます。このコード行は、ページの読み込み時に既に実行されているためです。

于 2012-04-10T15:16:41.060 に答える
0

関数のバインドのみが発生します。実際のコードの実行は、クリックイベントが発生したときに発生します。クリックイベントが発生すると、メッセージ変数の最後の値は「Notinface」になります。

于 2012-04-10T15:19:01.683 に答える
0
// below you are estblishing the "variable" message and setting it to the String "Spoon!"
var message = 'Spoon!';
// Here you use the jquery method to tell a button with the ID "foo" 
//    to alert the variable "message"
$('#foo').bind('click', function() {
    alert(message);    //    the alert
});

//  Here's where you're getting confused
//Below you are "re-asigning the variable "message" to be the String "Not in the face!"
message = 'Not in the face!';
// below is another click bind to a button, but this time the id name is "bar"
// so both buttons (foo and bar) are committing the same action, 
// but your variable has been changed to "Not in the face!" and therefor
//  will never display "Spoon!"
$('#bar').bind('click', function() {
    alert(message);
});
于 2012-04-10T15:20:57.220 に答える