функция обратного вызова возвращает глобальный объект: / - PullRequest
0 голосов
/ 29 июля 2010

Пожалуйста, помогите с моей проблемой, описанной ниже:

var Land = function(){
    this.cities = [];
}
Land.prototype = {
    addCity : function(city){
        this.cities.push(city);
    }
}
var City = function(){
    this.val = "foo";
};
City.prototype = {
    test : function(){
        this.val = "bar";
        console.log(this);
    }
}


var myLand = new Land();
myLand.addCity(new City());

// this row return right - City Object - :)
myLand.cities[0].test();

function callBack(fnc){
    fnc();
}

// this row return fail - global object - :(
// i need return City Object as in the first case
callBack(myLand.cities[0].test);
​

1 Ответ

1 голос
/ 29 июля 2010

Это происходит потому, что ваша функция callback напрямую вызывает параметр fnc, а ссылка fnc не содержит базовый объект (fnc не связан ни с одним доступным объектом)

Есть много способов избежать этого, самый простой IMO, это использовать анонимную функцию и выполнить вашу функцию:

callBack(function () {
  myLand.cities[0].test();
});

Таким образом, значение this внутри test будетбыть объектом myLand.cities[0].

См. этот вопрос для получения дополнительной информации о поведении значения this в функциях.

...