在回调后提到自我

时间:2015-01-03 14:49:10

标签: javascript object callback

似乎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

我想知道为什么会出现这个问题,最好是解决这个问题的最佳做法。

3 个答案:

答案 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);
    }
}

http://jsfiddle.net/4gt2u0y9/

解决方案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);
    }
}

http://jsfiddle.net/4gt2u0y9/2/