tldeti 2012-02-13 12:33
浏览 695
已采纳

做ajax请求时callback函数调用时this变量的变化问题

代码大致如下
[code="javascript"]
var a = (function(){
var a = function (...,param) {
return new a.fn.init (...,param)

}
a.fn = a.prototype = {
init: function (...) {
...
this.param = param
}
callback: function (response) {
this.param //这里似乎this发生改变,this.param值为undefined
...
}
getData: function() {
//通过ajax获得数据,然后回调 callback
doGetAjax(url,data,this.callback)
}
}
a.fn.init.prototype = a.fn;
})()
[/code]
像这种地方想要在callback获得param应该怎么做?

edit1

想了一下,这里ajax返回调用的时候this已经没有绑定了,在a内找不到再次与this绑定的方法,
那就不使用this,使用函数类的局部全局变量达到私有变量的效果,
代码改变如下
:[code="javascript"]
var a = (function(){
var pParam; //添加私有变量
...
init: function (...) {
...
pParam=this.param = param
}
...
callback: function (response) {
pParam //这里似乎this发生改变,this.param值为undefined
...
}
[/code]
想了一下,是否所有对象的属性都应该赋值给 私有变量,而 this.XXX则是要暴露给外界才多加一个赋值?

edit 2

这两天重新看了下,发现这种私有变量是所有实例共享的,一个页面有多个同类组件的话就不行了.
如果是存储一个共享私有变量,每次ajax请求以后都手动立刻将私有变量赋值给相应实例变量,但这样的缺点是多次自动进行ajax操作的话是实现不了的,比如分页ajax请求。

这种情况究竟咋解决.

  • 写回答

4条回答 默认 最新

  • ylf0716 2012-02-24 14:13
    关注

    感觉你说的很乱,猜的也很乱,这是一个基本的问题。
    假设你的代码是这样的:
    [code="js"]

    doGetAjax = function(url, data, cb){ //.... var response = {}; cb(response); } var a = function(){ } a.prototype = { init: function(param){ this.param = param; }, callback: function(response){ alert(this.param); }, getData: function(){ //通过ajax获得数据,然后回调 callback var url = '', data = {}; doGetAjax(url,data,this.callback) } } var obj = new a(); obj.init('a'); obj.getData();

    [/code]
    执行到doGetAjax这里时,调用doGetAjax的是谁?这个你一定要搞清楚。
    你不妨在doGetAjax方法中加上alert(this)看看:
    [code="js"]
    doGetAjax = function(url, data, cb){
    //....
    alert(this);
    cb();
    }
    [/code]
    可以看出doGetAjax这个方法是全局的,也可以说是window的对象,那么调用这个
    方法的就是window,所以alert(this)打出来的也是: Object DOMWindow这个对象
    然后你执行cb()这个时候还是用window对象去执行cb,所以你回调方法:
    [code="js"]
    callback: function(response){
    alert(this.param);
    },
    [/code]
    这个里面的this应是window对象,当然获取不到param,如果你想获得obj的param的话应该这样:
    [code="js"]
    doGetAjax = function(url, data, cb, scope){
    //....
    var response = {};
    cb.call(scope, response);
    }
    [/code]
    调用的时候要把当前对象指针传过去:
    [code="js"]
    getData: function(){
    //通过ajax获得数据,然后回调 callback
    var url = '', data = {};
    doGetAjax(url,data,this.callback, this)
    }

    [/code]
    这样this才是obj而不是window了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 一道python难题2
  • ¥15 一道python难题
  • ¥15 用matlab 设计一个不动点迭代法求解非线性方程组的代码
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler
  • ¥15 oracle集群安装出bug
  • ¥15 关于#python#的问题:自动化测试
  • ¥20 问题请教!vue项目关于Nginx配置nonce安全策略的问题
  • ¥15 教务系统账号被盗号如何追溯设备