Javascript "this", указывающий на неправильный объект внутри лямбды, указанный в файле array.map - PullRequest
4 голосов
/ 02 февраля 2012
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; } указывает это на неправильный объект.

Ответы [ 2 ]

7 голосов
/ 02 февраля 2012

Согласно 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 голосов
/ 02 февраля 2012

Вам необходимо определить ссылку на ваш экземпляр в области видимости, а затем получить его позже в другом экземпляре. Обновите свой метод до этого

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