代码大致如下
[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应该怎么做?
想了一下,这里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则是要暴露给外界才多加一个赋值?
这两天重新看了下,发现这种私有变量是所有实例共享的,一个页面有多个同类组件的话就不行了.
如果是存储一个共享私有变量,每次ajax请求以后都手动立刻将私有变量赋值给相应实例变量,但这样的缺点是多次自动进行ajax操作的话是实现不了的,比如分页ajax请求。
这种情况究竟咋解决.
感觉你说的很乱,猜的也很乱,这是一个基本的问题。
假设你的代码是这样的:
[code="js"]
[/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了。
感觉你说的很乱,猜的也很乱,这是一个基本的问题。
假设你的代码是这样的:
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();
执行到doGetAjax这里时,调用doGetAjax的是谁?这个你一定要搞清楚。
你不妨在doGetAjax方法中加上alert(this)看看:
doGetAjax = function(url, data, cb){ //.... alert(this); cb(); }
可以看出doGetAjax这个方法是全局的,也可以说是window的对象,那么调用这个
方法的就是window,所以alert(this)打出来的也是: Object DOMWindow这个对象
然后你执行cb()这个时候还是用window对象去执行cb,所以你回调方法:
callback: function(response){ alert(this.param); },
这个里面的this应是window对象,当然获取不到param,如果你想获得obj的param的话应该这样:
doGetAjax = function(url, data, cb, scope){ //.... var response = {}; cb.call(scope, response); }
调用的时候要把当前对象指针传过去:
getData: function(){ //通过ajax获得数据,然后回调 callback var url = '', data = {}; doGetAjax(url,data,this.callback, this) }
这样this才是obj而不是window了。
感觉你说的很乱,猜的也很乱,这是一个基本的问题。
假设你的代码是这样的:
执行到doGetAjax这里时,调用doGetAjax的是谁?这个你一定要搞清楚。
你不妨在doGetAjax方法中加上alert(this)看看:
doGetAjax = function(url, data, cb){ //.... alert(this); cb(); }
可以看出doGetAjax这个方法是全局的,也可以说是window的对象,那么调用这个
方法的就是window,所以alert(this)打出来的也是: Object DOMWindow这个对象
然后你执行cb()这个时候还是用window对象去执行cb,所以你回调方法:
callback: function(response){
alert(this.param);
},
这个里面的this应是window对象,当然获取不到param,如果你想获得obj的param的话应该这样:
doGetAjax = function(url, data, cb, scope){
//....
var response = {};
cb.call(scope, response);
}
调用的时候要把当前对象指针传过去:
getData: function(){
//通过ajax获得数据,然后回调 callback
var url = '', data = {};
doGetAjax(url,data,this.callback, this)
}
这样this才是obj而不是window了。
iteye什么编辑器啊 晕死