2

其中Ajax.use,回调函数内部的this指的是回调函数。

然而,在回调定义之外this将引用 Ajax 的特定实例。

这就是我使用thisin Ajax.invoke->this.use()从另一个成员方法调用成员方法的方式。

我还需要在回调函数内部调用一个成员方法。

我猜到并输入

this.invoke()

但我不认为这是指回调函数中的正确对象。我认为它指的是回调函数对象。

/**
 *    Ajax
 */

var Ajax = ( function () 
{
    var Ajax = function (element) 
    {
        this.object = this.create();
    };
    Ajax.prototype.create = function() 
    {
        var request;
        try
        {
            request = new window.XMLHttpRequest();
        }
        catch( error )
        {
            try 
            {
                request = new window.ActiveXObject( "Msxml2.XMLHTTP" );
            }
            catch( error )
            {
                try
                {
                    request = new window.ActiveXObject( "Microsoft.XMLHTTP" );
                }
                catch( error )
                {
                    request = false;
                }
            }
        }
        // alert("Object Created Successfully");
        return request;
    };

    Ajax.prototype.use = function( param, ajax_func )
    {
        alert("Ajax.prototype.use Called");
        this.object.open( "POST", Global.GATEWAY, true );
        this.object.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
        this.object.setRequestHeader( "Content-length", param.length );
        this.object.setRequestHeader( "Connection", "close" );
        this.object.onreadystatechange = function()
        {
            if( this.readyState === 4 )
            {
                if( this.status === 200 )
                {
                    ajax_func( this.responseText );
                    return true;
                }
                else
                {
                    this.invoke( param, ajax_func );
                    return false;
                }
            }
        };
        this.object.send( param );
        return true;
    };

    Ajax.prototype.invoke = function( param, ajax_func )
    {
        var state = false,
            count = 1;
        while( state === false && count <= 5 )
        {
            if( count !== 1 )
            {
                alert( 'Ajax Object Use Failed | Try Again ');
            }
            state = this.use( param, ajax_func );
            count++;
        }
        return state;
    };

    return Ajax;

} () );
4

1 回答 1

2

您完全正确,您的回调内部this不再是对 Ajax 对象的引用。您需要创建一个可以在回调中使用的引用:

Ajax.prototype.use = function( param, ajax_func )
{
    alert("Ajax.prototype.use Called");
    var self = this;
    this.object.open( "POST", Global.GATEWAY, true );
    this.object.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
    this.object.setRequestHeader( "Content-length", param.length );
    this.object.setRequestHeader( "Connection", "close" );
    this.object.onreadystatechange = function()
    {
        if( this.readyState === 4 )
        {
            if( this.status === 200 )
            {
                ajax_func( this.responseText );
                return true;
            }
            else
            {
                self.invoke( param, ajax_func );
                return false;
            }
        }
    };
    this.object.send( param );
    return true;
};

请注意,我是在定义var self = this;和使用self而不是this在回调内部。

于 2012-04-13T19:54:40.920 回答