2015-05-27 2 views
1

Я фрагмент JS кода, как этотПочему это = это в javascript?

Customer.prototype.parseAddress = function(data){ 
    this.address = data.address; 
} 
Customer.prototype.loadAddress = function(){ 
    ... 
} 

мне нужно реализовать функцию loadAddress.

Может кто-нибудь объяснить мне, почему этот фрагмент кода является правильным

var that = this; 
$.get('data.xml', function(data){ 
    that.parseAddress(data); 
}); 

и ниже не правильно

$.get('data.xml', function(data){ 
    this.parseAddress(data); 
}); 
+0

Трудно сказать, потому что фотографии недостаточно. «this» относится к инкапсулирующему объекту. В зависимости от того, где вы его вызываете (или присваиваете его переменной), он будет ссылаться на любой объект, в который он вызван. – OscillatingMonkey

+1

'this' inside success' $ .get() 'callback ссылается на объект jqXHR –

+0

в зависимости от того, где это находится в коде, который он изменяет. Это контекст исполнения. Внутри функции контекст выполнения отличается от предыдущего. – AmmarCSE

ответ

1

В Javascript, this специальная контекстная ключевое слово, которое меняется в зависимости от того, где вы его используете.

Пользуясь that = this;, вы экономите: this значит, так что вам не о чем беспокоиться. this означает, что вы думаете об этом.

my_func = function() { 
    var that = this; 
    console.log(this); //prints one thing 

    my_inner_func = function() 
    { 
     console.log(this); //prints another 
     console.log(that); //prints what the first log printed 
    } 
    my_inner_func(); 
} 
+0

Можете ли вы вкратце объяснить, что это за само? – AmmarCSE

+0

Оформление заказа https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this.Это в основном «я» в Python, но меняет то, что «self» указывает на то, насколько глубоко он вложен. – TankorSmash

1

Дело в том, что при вызове функции необходимо передать контекст функция, иначе контекст будет новым, указанным в запросе. Вы должны проверить следующие понятия (вызов, применение и привязка).

Вы можете написать:

$.get('data.xml', function(data){ 
    this.parseAddress(data); 
}.bind(this)); 

Хорошая ссылка ссылка на исследование о нем: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

+0

Прошу прощения. Вы не можете использовать звонок или применять, я просто хотел помочь ему с похожими понятиями. –

+0

спасибо, эта информация была полезна. – user2783193

+0

@PedroAugusto Не волнуйтесь, это как-то отвечает на вопрос;) –

1

Причина этого заключается в том, потому что this контекстная и может изменяться в пределах обратного вызова.

Что я имею в виду заявления является

this.parseAddress 

parseAddress был определен на this. Однако, когда вызывается функция обратного вызова, this не может быть объектом, который вы ожидаете, jQuery делает это совсем немного. Поэтому вы не можете получить доступ к другим свойствам оригинала this из обратного вызова.

Простейший способ справиться с этим - сохранить ссылку на оригинал this, сохранив его в that. Теперь вы всегда можете вернуться к исходному объекту и получить доступ к дополнительным свойствам из-за исходной ссылки в that, доступной в рамках обратного вызова jQuery.

+0

Уход, чтобы объяснить нижний план? Я не уверен, что не так с ответом? – Ian

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