2
<section id="clickme">
     <p>Stuff goes here.</p>
</section>


$("#clickme").on("click", function(){
    alert(this.innerHTML);
    setTimeout(function(){
                alert(this.innerHTML);
    }, 1000);
})

2 番目のアラートが定義されていない理由を知っている人はいますか?

4

5 に答える 5

2

this変化します。プロキシするだけで回避できますthis(別の場所に保存します):

var that = this;
setTimeout(function(){
            alert(that.innerHTML);
}, 1000);

または使用することによりbind(効果的に同じことを行います)。

于 2013-08-20T02:00:00.383 に答える
2

@jaeheungが答えたように:

setTimeout() は Window オブジェクトのメソッドです。そして、「this」は、innerHTML を持たない Window を指しています。

競合がないように、オブジェクトを格納する変数を作成するだけです。

$("#clickme").on("click", function(){
    var myObj = this;
    alert(myObj.innerHTML);
    setTimeout(function(){
                alert(myObj.innerHTML);
    }, 1000);
})
于 2013-08-20T02:02:47.383 に答える
0

setTimeout() は Window オブジェクトのメソッドです。そして、「this」は、innerHTML を持たない Window を指します。

于 2013-08-20T02:00:00.850 に答える
0

内部関数内でコンテキストが変化します。thisその中でターゲットを使用する場合は、次のように、その前にvar を設定する必要があります。

$("#clickme").on("click", function(){
    alert(this.innerHTML);
    var that = this;
    setTimeout(function(){
                alert(that.innerHTML);
    }, 1000);
})

フィドル

于 2013-08-20T02:00:05.063 に答える
0

あなたのコードは以下と同等です:

$("#clickme").on("click", function(){
    alert(this.innerHTML);             // `this` points to the event object (`section`)
    window.setTimeout(function(){      // notice the 'window.'
                alert(this.innerHTML); // `this` now points to `window`
    }, 1000);
})

内部が を指しているため、 が に変換されるため、undefinedエラーが発生しています。オブジェクトには属性がないため、プロパティになります。this.innerHTMLwindow.innerHTMLthiswindowwindowinnerHTMLundefined

要素オブジェクトを使用するにはsection、それを変数のどこかにキャッシュする必要があります。

$("#clickme").on("click", function(){
    var _this = this;                  // cached
    alert(_this.innerHTML);            // use cached
    setTimeout(function(){
       alert(_this.innerHTML);         // use cached
    }, 1000);
})

または、IE で動作するかどうかわからない方法は、引数として次のように渡すことsetTimeoutです。

$("#clickme").on("click", function(){
    alert(this.innerHTML);              // `this` points to the event object (`section`)
    setTimeout(function(_this){         // notice the `_this` as a parameter
                alert(_this.innerHTML); // `_this` now points to the argument
    }, 1000, this);                     // pass it here
})
于 2013-08-20T02:07:14.760 に答える