1

一旦激活了ajax回调函数,我想调用一个内部函数。因为有一个延迟,我想知道我的局部变量在被调用时是否仍然正确,特别是 this.response_element 因为它被回调函数使用。

ajax时发起回调函数status == 200

var ControlSignIn = function( ) 
{
    this.form_element = document.getElementById( 'signin' ),
    this.response_element = document.getElementById( 'signin_response' ),
    this.text_object = new Text( this.form_element ), 
    this.message_object = new Message( this.response_element );
};

ControlSignIn.interface = function()
{
    new ControlSignIn().invoke();
};

ControlSignIn.prototype.invoke = function( ) 
{
    if( CONSTANT.VALIDATE_ON === 1 )
    {
        if( !this.text_object.checkEmpty() ) 
        {
            this.message_object.display( 'empty' );
            return false;
        }
        if( !this.text_object.checkPattern( 'email' ) ) 
        {
            this.message_object.display( 'email' );
            return false;
        }
        if( !this.text_object.checkPattern( 'pass' ) ) 
        {
            this.message_object.display( 'pass' );
            return false;
        }
    }

/* new internal call_back */    

        AjaxNew.use( ajaxSerialize( this.form_element ) + '&ajax_type=ControlSignIn', ControlSignIn.invoke.callBack );

    function callBack( server_response_text )
    {
        ajaxType( server_response_text, this.response_element, 'respond' ); 
    }

/*  Removed
    Ajax.repeatUse( ajaxSerialize( this.form_element ) + '&ajax_type=ControlSignIn', ajaxTypeRespond, this.response_element );
*/

};

解决方案:

AjaxNew.use( ajaxSerialize( this.form_element ) + '&ajax_type=ControlSignIn', ControlSignIn.invoke.callBack );

var response_element = this.response_element;
function callBack( server_response_text )
{
    ajaxType( server_response_text, response_element, 'respond' ); 
}
4

2 回答 2

1

答案是肯定的和否定的。是的,局部变量仍然存在,但this引用总是在每次函数调用时重置。因此回调将有自己的this价值。

解决方案是利用答案的“是”部分并将您的this参考保存在另一个变量中。this然后在回调中使用该变量(而不是)。

现在,就是说,您的代码结构让我有点困惑,我无法准确说出您的“回调”应该如何工作;也就是说,它引用this但我不明白它期望它是如何设置的。

于 2012-04-03T20:59:39.487 回答
1

不,不会的。即使该属性可能是完整的,this也不会指向该对象。

将值复制到局部变量,并使用函数字面量,然后局部变量将在函数的闭包中被捕获并保持完整且可访问:

var element = this.response_element;
AjaxNew.use(
  ajaxSerialize(this.form_element) + '&ajax_type=ControlSignIn',
  function(server_response_text) {
    ajaxType(server_response_text, element, 'respond'); 
});
于 2012-04-03T21:02:08.100 回答