似乎javascript中的这个引用在回调函数之后不起作用。运行此代码时:
new Bla().start();
function Bla(){
this.start = function(){
alert("starting");
x(this.done);
}
this.done = function(){
alert("done");
try{
this.postDone();
}
catch(e){
alert(e);
}
}
this.postDone = function(){
alert("postdone");
}
}
function x(callback){
alert("x");
try{
callback();
}
catch(e){
alert(e);
}
}
警报如下:
Starting
x
done
TypeError: undefined is not a function
我想知道为什么会出现这个问题,最好是解决这个问题的最佳做法。
答案 0 :(得分:3)
像这样更改x
函数调用,
this.start = function(){
alert("starting");
x(this.done.bind(this));
}
答案 1 :(得分:0)
你需要保存对该上下文的引用,因为这里的上下文更改,请参见此处如何将其存储在ref中并传递给参数然后使用...来调用...
new Bla().start();
function Bla(){
this.start = function(){
alert("starting");
x(this.done ,this);
}
this.done = function(){
alert("done");
try{
var st = arguments[0];
console.log(st);
st.postDone();
}
catch(e){
alert(e);
}
}
this.postDone = function(){
alert("postdone");
}
}
function x(callback,ref){
alert("x");
try{
callback(ref);
}
catch(e){
alert(e);
}
}

希望有所帮助...
答案 2 :(得分:0)
函数本质上不知道“this”对象。只有在调用到对象的函数时才会获得“this”对象,例如obj.func()
。只需拨打func()
即可生成undefined
“此”对象。
我可以为您的代码考虑三种可能的解决方案:
解决方案1:使用回调传递“this”对象,并使用call()或apply()
调用其上的回调...
function Bla(){
this.start = function(){
alert("starting");
x(this.done,this);
}
...
function x(callback,object){
alert("x");
try{
callback.apply(object);
}
catch(e){
alert(e);
}
}
解决方案2:传递“this”对象和要调用的函数名称
...
function Bla(){
this.start = function(){
alert("starting");
x(this,'funcName');
}
...
function x(object,funcName){
alert("x");
try{
object[funcName]();
}
catch(e){
alert(e);
}
}
http://jsfiddle.net/4gt2u0y9/1/
解决方案3:仅传递“this”对象,并让回调客户端采用回调名称
...
function Bla(){
this.start = function(){
alert("starting");
x(this);
}
...
function x(callbackServer){
alert("x");
try{
callbackServer.done();
}
catch(e){
alert(e);
}
}