1

私はこのコードを持っています:

var as = document.getElementsByTagName('a');

     for ( var i = as.length; i--; ) {

    as[i].onclick = function(num) {

        return function() {
          console.log(num);
    }; 

    }(i);
}

numこれは期待どおりに機能しますが、以下に示すように return 関数に追加すると。プリントアウトしmouse eventます。なんで?

var as = document.getElementsByTagName('a');

     for ( var i = as.length; i--; ) {

    as[i].onclick = function(num) {

        return function(num) {  //Adding num here causes issue
          console.log(num);
    }; 

    }(i);
}
4

2 に答える 2

3

onclickイベントに関数を返しています。その関数は、イベントがトリガーされたときに呼び出されるものです。

JavaScript がイベント関数を呼び出すと、Eventオブジェクトが渡されます。

numと言う場所に追加すると、外側の変数 (の値) をシャドウ//Adding num here causes issueする新しいローカル変数が作成されます。numi

as[i].onclick = function(num) {
    return function(e){
      console.log(e, num);
    }; 
}(i);
于 2013-09-19T15:10:51.557 に答える
2

基本的に次のようなものを割り当てているためです。

function(num) {
    console.log(num);
}; 

各クリックイベントに。ただし、関数がイベントに割り当てられると、関数が受け入れる最初の引数は、イベントに対応するイベント オブジェクトによって設定されます。したがって、ブラウザーが検索するnumconsole.log(num);、最も内側のスコープ (イベント ハンドラーとして割り当てられた関数のスコープ) から開始されnum、クリック イベントのイベント オブジェクトを指していることがわかります。したがって、これがコンソールに表示されます。

于 2013-09-19T15:13:00.650 に答える