«это» ссылка в JavaScript - PullRequest
       21

«это» ссылка в JavaScript

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

У меня есть небольшая проблема в объектном программировании в javascript.

. Существует задача класса, в ней есть несколько методов, метод, содержащий асинхронную отправку запроса с помощью JQuery ($.ajax).После успешного выполнения запроса необходимо выполнить определенный метод (например, successFunction) класса Task.

Проблема заключается в том, что после запроса в теле successFunction невозможно ссылаться на класс с помощью ключевого слова * 1006.*, поскольку контекст изменился, и он содержит ссылку на jquery-объект , который выполняет ajax-запрос .

Какие варианты ссылаются на текущийОбъект задачи внутри функции, которая не была вызвана напрямую, но существует извне?(Например, по событию или ajax)

Ответы [ 4 ]

10 голосов
/ 05 февраля 2012

Обычно внутри события AJAX, такого как обратный вызов успеха, this относится к объекту, возвращенному вызовом $.ajax. Вы можете использовать параметр context, чтобы изменить контекст в обратном вызове успеха:

$.ajax({
    url: '/foo',
    context: this, // <!-- change the context of the success callback
    success: function(result) {
        // 'this' here will refer to whatever it refered outside
    } 
});

Вы также можете передавать сложные объекты:

$.ajax({
    url: '/foo',
    context: { element: this, foo: 'bar' },
    success: function(result) {
        // you can use 'this.element' and 'this.foo' here
    } 
});
9 голосов
/ 05 февраля 2012

Вы можете определить переменную, которая содержит ссылку на объект:

function Task() {
  var that = this;
  this.call = function() {
    $.ajax({
      url: '/foo',
      success: function(result) {
        console.log(that); // <-- you cann access this object via that
      }
    });
  };
}
3 голосов
/ 25 сентября 2018

this в JavaScript

Каждый раз, когда фаза выполнения (код начинает выполняться) создается в javascript. JS engine предоставляет нам ключевое слово this.

1. Вход в файл JS (скажем, script.js)

console.log(this);

это указывает на глобальный объект (окно).

Окно {postMessage: ƒ, размытие: ƒ, фокус: ƒ, закрытие: ƒ, кадры: Окно, ...}


2. Внутри функция

function a(){
   console.log(this);
}
a();

При использовании в функции это относится к Глобальному объекту (окну) .

Окно {postMessage: ƒ, размытие: ƒ, фокус: ƒ, закрытие: ƒ, кадры: Окно, ...}


3. "использовать строгое"

"use strict";
function myFunction() {
    console.log(this);
}

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

неопределенный


4. выражение функции

var b = function(){
 console.log(this);
}
b();

При использовании в выражении функции это относится к Глобальному объекту (окну) .

Окно {postMessage: ƒ, размытие: ƒ, фокус: ƒ, закрытие: ƒ, кадры: Окно, ...}


5. Метод объекта

var c = {
   name : "John",
   log : function(){
     console.log(this);
  }
}
c.log();

this относится к c объекту.

{имя: "Джон", журнал: ƒ}

6. Метод внутри объекта метод

var d = {
   name : "John",
   log : function(){
     console.log(this);
     // refers to d object

    var setname = function(){
        console.log(this);
       //refer to global object (window)
    }
    setname();
  }
}
d.log();

Это причудливый режим JavaScript. Используйте приведенный ниже код для исправления.

var d = {
   name : "John",
   log : function(){
      var self = this;
      // in some js library `that` is used

     console.log(self);
     // refers to d object

    var setname = function(){
        console.log(self);
        console.log(self.name);
       //refers to d object
    }
    setname();
  }
}
d.log();

this относится к d объекту.

{имя: "Джон", журнал: ƒ}

0 голосов
/ 05 февраля 2012

Используйте замыкания. Вы можете прочитать о них здесь:

http://www.using -jquery.com / 2010/12 / что-это-JavaScript-замыкания /

...