在模块模式中的回调函数中,“this”指的是什么

时间:2012-04-13 19:51:13

标签: javascript

Ajax.use中,在回调函数中,这指的是回调函数。

但是,在回调定义this之外会引用Ajax的特定实例。

这就是我在this中使用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;

} () );

1 个答案:

答案 0 :(得分: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