0

この問題の 4 時間で停止し、ifGoogle マップのイベントが呼び出されたときに bool を無視しました。パラメータに異なるデータを与える必要があります。たぶん、世界で誰かが理由を知っていますか?

console.log同時にクリックした後にスローします:

true before click
stack.html:56[object HTMLDivElement]in listener
stack.html:62[object HTMLDivElement]bunga bunga

壊れたブール:

this.b = true;
...
console.log(this.b + " beafore click");
this.mapListener = google.maps.event.addListener(map, 'click', function(e) {
    console.log(this.b + "in listener");
    if (this.b==true) {
        console.log(this.b + "true works");
        tools[type](e.latLng, last_marker_origin);
        this.b = false;
    } else {
        console.log(this.b + "bunga bunga");
        //tools[type](e.latLng);
    }
});

this私のオブジェクトのデフォルト設定では「プロパティ」を参照していますが、オプションを変更するとフラグはtrueになります。

とりあえず寝ます。午前中にお答えします。

4

2 に答える 2

1

あなたの問題は、それがあなたthisへの有効な参照ではなくなったことですproperties。特定の問題に対処する最も簡単な方法は、コードを変更することです。

this.b = true;
var props = this;
console.log(this.b + " beafore click");  //Notice that "this" is still valid here 
this.mapListener = google.maps.event.addListener(map, 'click', function(e) {
    console.log(props.b + "in listener");
    if (props.b == true) {
        console.log(props.b + "true works");
        tools[type](e.latLng, last_marker_origin);
        props.b = false;
    } else {
        console.log(props.b + "bunga bunga");
        //tools[type](e.latLng);
    }
});

基本的な問題は、コールバック関数を実際に呼び出すコードが完全に異なるスコープにあるため、thisそのコードの実行時に意味が変わったことです。参照を設定してコードに入れると、問題が解決します。

于 2012-04-25T22:19:57.017 に答える
1

ここでの問題は のスコープですthis。クリック イベント ハンドラー関数内にいるときはthis、プロパティ オブジェクトではなく、イベント ハンドラーを参照します。イベント ハンドラーは、いわゆるクロージャーです。

あなたの問題には2つの可能な解決策があります。

  1. 値に(var bの代わりにthis.b) ローカル変数を使用します。ローカル変数はクロージャーにコピーされるため、クロージャーの内外で値を使用できます。

    var b = true;
    console.log(b + " beafore click");
    this.mapListener = google.maps.event.addListener(map, 'click', function(e) {
        console.log(b + "in listener");
        if (b==true) {
            console.log(b + "true works");
            tools[type](e.latLng, last_marker_origin);
            b = false;
        } else {
            console.log(b + "bunga bunga");
            //tools[type](e.latLng);
        }
    });
    
  2. ローカル変数に保存thisします。これは、スコープの問題を回避するための非常に一般的な手法です。

    //save this in a locale variable, now 'me' provides access to this scope
    var me = this;
    me.b = true;
    console.log(me.b + " beafore click");
    this.mapListener = google.maps.event.addListener(map, 'click', function(e) {
        console.log(me.b + "in listener");
        if (me.b==true) {
            console.log(me.b + "true works");
            tools[type](e.latLng, last_marker_origin);
            me.b = false;
        } else {
            console.log(me.b + "bunga bunga");
            //tools[type](e.latLng);
        }
    });
    
于 2012-04-25T22:25:00.887 に答える