JavaScript中的'this'参考

时间:2012-02-05 13:16:45

标签: javascript ajax jquery this

我在javascript中的对象编程有一点问题

有一个“类”任务,它有几个方法,一个包含在JQuery($.ajax)的帮助下异步发送请求的方法。请求成功后,必须执行类Task的特定方法(例如successFunction)。

问题是,在successFunction正文中的查询之后,使用关键字this无法引用该类,因为上下文已经更改,并且它包含对 jquery-object的引用执行 ajax-request

哪些变体引用函数内部的当前Task对象是直接导致但外部存在? (例如,通过事件或ajax)

4 个答案:

答案 0 :(得分:10)

通常在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
    } 
});

答案 1 :(得分:9)

您可以定义一个保存对象引用的变量:

function Task() {
  var that = this;
  this.call = function() {
    $.ajax({
      url: '/foo',
      success: function(result) {
        console.log(that); // <-- you cann access this object via that
      }
    });
  };
}

答案 2 :(得分:3)

this in JavaScript

每次在javascript中创建执行阶段(代码开始执行)。 JS引擎向我们提供了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对象。

  

{姓名:“约翰”,登录:ƒ}

答案 3 :(得分:0)

使用闭包。你可以在这里阅读它们:

http://www.using-jquery.com/2010/12/what-are-javascript-closures/