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 に答える