2017-02-10 7 views
1

私は実際にforeach(console.logが印刷される)でこれがWindowオブジェクトになる理由を理解していません。前もって感謝します。予期せぬバインドを使用した後のこの値

コードでは、ホバーイベントが検出され、範囲スライダの値が読み取られます。

HTML、

<input type="range" min="0" max="255" step="1" value="10" id="rangeR"> 

JS、

var ColorDispatcher = function() { 
this.rgbColorArray=new Array(0,0,0); 
}; 

ColorDispatcher.prototype = { 
hoverHandler:function() { 
    var SliderArray=new Array(document.getElementById("rangeR")); 
    SliderArray.forEach(function sliderHandler(element, index, array){   
    console.log(this); 
      element.addEventListener("change", function() { 
       if(index==0){//R 
        this.rgbColorArray[0]=element.value;      
       } 
      }); 

    }); 


}, 

}; 
var dispatcher = new ColorDispatcher(); 
document.body.addEventListener('mouseover',dispatcher.hoverHandler.bind(dispatcher)); 
+1

[this 'キーワードは、オブジェクトのプロトタイプ内のウィンドウオブジェクトをJavascriptで返しますか?](http://stackoverflow.com/questions/13224620/the-this-keyword-returns-the-window-object -within-an-object-prototype-in​​-jav) – RaR

答えて

0

bindは、呼び出された関数の値をthisに設定します。あなたがdispatcher.hoverHandlerを呼び出すと、その後、thisdispatcher

この行です:

console.log(this); 

...それはあなたがSliderArray.forEachに渡すsliderHandler機能の一部であるdispatcher.hoverHandler

の一部ではありません。

違うthis値を渡したい場合は、あなたが(機能後)forEach引数を使用してそれを行う必要があります。

-1

あなたはコールバック関数の名前はなぜ?

私は匿名関数を渡す代わりに、グローバル関数を作成し、次に 'this'がウィンドウであると思います。

名前 'sliderHandler'を削除してみます。

+0

"なぜコールバック関数に名前を付けましたか?" - スタックトレースを見るときに関数の名前を付けると便利です。 (また、関数を再帰的に呼び出すこともできますが、ここではこれは起こっていません)。 – Quentin

+0

"グローバル関数を作成する" - **いいえ!**名前付き関数式は自動的にグローバルを作成しません。彼らは、自分のスコープの中で期待される名前で変数を作成することさえしません。 (これは、作成されたスコープ内に名前を持つ変数を作成する関数宣言とは異なります) – Quentin

+0

私の悪い^^私はあなたが無名関数に名前を付けることができないことを知りませんでした – PortePoisse

関連する問題