2012-01-30 3 views
2

Можно создать дубликат:
Why doesn't this closure have access to the 'this' keyword? - jQuery

function class1() { 
    this.url = 'http://en.wikiquote.org/w/api.php?action=query&format=json&prop=revisions&titles=Albert_Einstein&rvprop=content&callback=?'; 

    this.f = function() { 
     $.getJSON(this.url, function() { 
      console.log(this.url); 
     }); 
    } 
}; 

var obj = new class1(); 
obj.f(); 

Вместо печати URL, obj.f() печатает "неопределенные" на консоль. Почему это происходит и что я могу сделать, чтобы предотвратить это поведение?

ответ

4

Внутри вашего обратного вызова ajax, this будет объектом jqXhr, а не вашим текущим объектом. Вы хотите, чтобы сохранить значение this до вашего AJAX вызова, а также ссылок на что в обратном вызове:

this.f = function() { 
    var self = this; 
    $.getJSON(this.url, function() { 
     console.log(self.url); 
    }); 
} 
2

Как насчет сохранения переменной url как локальные, используя var заявление:

function class1() { 
    var url = 'http://en.wikiquote.org/w/api.php?action=query&format=json&prop=revisions&titles=Albert_Einstein&rvprop=content&callback=?'; 

    this.f = function() { 
     $.getJSON(url, function() { 
      console.log(url); 
     }); 
    } 
}; 

Это делает переменную url частной; просто имейте в виду, что если вы пытаетесь получить доступ к переменной url вне функции class1.

+0

, но теперь 'url' является приватным –

+0

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

+2

достаточно справедливо. Возможно, вы захотите добавить редактирование, которое будет работать, если OP не возражает против того, что URL-адрес больше не является общедоступным. –

Смежные вопросы