我在javascript中的对象编程有一点问题
有一个“类”任务,它有几个方法,一个包含在JQuery($.ajax
)的帮助下异步发送请求的方法。请求成功后,必须执行类Task的特定方法(例如successFunction)。
问题是,在successFunction正文中的查询之后,使用关键字this
无法引用该类,因为上下文已经更改,并且它包含对 jquery-object的引用执行 ajax-request 。
哪些变体引用函数内部的当前Task对象是直接导致但外部存在? (例如,通过事件或ajax)
答案 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/