【问题标题】:Javascript's "this" pointing to wrong object inside lambda given to array.mapJavascript的“this”指向给array.map的lambda中的错误对象
【发布时间】:2012-02-02 04:21:46
【问题描述】:
function myClass() { 
    this.nums = [1,2,3]; 
    this.divisor = 2; 
}

myClass.prototype.divideNumsByDivisor = function(){
    return this.nums.map(function(num) {
        return num*this.divisor; 
    });
}

myClass.divideNumsByDivisor() 应该将其成员变量nums 上的每个数字乘以其成员变量divisor 上的值。

这不起作用,因为函数 function(num) { return num*this.divisor; } 将其指向错误的对象。

【问题讨论】:

    标签: javascript map scope this


    【解决方案1】:

    根据MDN.map(fn, thisArg) 的第二个参数是您希望在调用回调函数时设置this ptr 并将其设置为全局对象(例如window)如果你不通过第二个参数。

    所以,你可以让你的例子像这样工作:

    function myClass() { this.nums = [1,2,3]; this.divisor = 2; }
    myClass.prototype.divideNumsByDivisor = function(){
        return this.nums.map(function(num) { return num*this.divisor; }, this);
    }
    

    【讨论】:

    • 我没有意识到这一点。非常感谢。
    【解决方案2】:

    您需要在范围内定义对您的实例的引用,然后稍后在不同的实例中获取它。将您的方法更新为此

    myClass.prototype.divideNumsByDivisor = function(){
        var me = this;
        return this.nums.map(function(num) { return num*me.divisor; });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-28
      • 2015-01-22
      • 2013-08-16
      相关资源
      最近更新 更多