【问题标题】:unexpected this value after using bind already已经使用绑定后意外的这个值
【发布时间】:2017-02-10 10:09:15
【问题描述】:

我真的不明白为什么在 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));

【问题讨论】:

标签: javascript


【解决方案1】:

bind 为调用它的函数设置this 的值。当你调用dispatcher.hoverHandler,那么this就是dispatcher

这一行:

console.log(this);

…不是dispatcher.hoverHandler的一部分

它是您传递给SliderArray.forEach 的sliderHandler 函数的一部分。

如果你想传递一个不同的this 值,那么你应该使用forEachsecond 参数(在函数之后)。

【讨论】:

    【解决方案2】:

    为什么要命名回调函数?

    我认为与其传递匿名函数,不如创建一个全局函数,然后“this”就是窗口。

    尝试删除名称“sliderHandler”。

    【讨论】:

    • "你为什么命名回调函数?" — 在查看堆栈跟踪时,为函数命名很有用。 (它还允许递归调用该函数,但这不会发生在这里)。
    • “你创建了一个全局函数”——不!命名函数表达式不会自动创建全局变量。他们甚至不会在自己的范围内创建一个名称为 expect 的变量。 (这与在创建变量的范围内创建变量的函数声明不同)
    • 我的错^^我不知道你可以命名匿名函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多