3

this以前の値を失った関数の内部に入ったときの値を保持するにはどうすればよいですか?this

たとえば、この場合、どうすればにアクセスできますかtestFunction

admin = function()
{
    this.testFunction = function()
    {
    alert('hello');
    }

    this.test2Function = function()
    {
        $.ajax({
            url:'',
            success: function()
            {
                 this.testFunction();
                 // here I got an error undefined 
            }
        });
     }
}

私はこのような自己変数でこれの値を維持しようとしました

this.self = this;

しかし、動作しません

4

5 に答える 5

5

クロージャーを使用する必要があります。JavaScriptでこれを行うための理想的な方法は次のとおりです。

function foo(){
   //Store this in outer scoped variable.
   // It will be available to anything within this scope
   var that = this;

   innerCall(function(){
      that.doSomething();
   });
}
于 2012-07-06T00:37:56.607 に答える
3
admin = function()
{
    var top = this;
    this.testFunction = function()
    {
    alert('hello');
    }

    this.test2Function = function()
    {
        $.ajax({
            url:'',
            success: function()
            {
                 top.testFunction();   // should work :)
            }
        });
     }
}

関数で定義されたすべてのローカル変数は、その関数で定義されたすべての関数を含め、WHOLE関数を介して伝播(アクセス可能)します。

したがってvar top = this;、の内部で宣言されたすべての内部関数とオブジェクトを通じてその値を伝達しますadmin

于 2012-07-06T00:36:06.327 に答える
1

あなた次第でそれが複数の方法と1つが適している全体像があります

admin = function()
{
    this.testFunction = function()
    {
    alert('hello');
    }

    this.test2Function = function()
    {
        $.ajax({
            url:'',
            success: this.testFunction
        });
     }
}

また

admin = function()
{
    var testFunction = function()
    {
    alert('hello');
    }

    this.test2Function = function()
    {
        $.ajax({
            url:'',
            success: testFunction 
        });
     }
}

また

admin = function(){this.testFunction = function(){alert('hello'); }

    var testFucntion = this.testFunction;

    this.test2Function = function()
    {
        $.ajax({
            url:'',
            success: function(){ testFucntion(); } 
        });
     }
}
于 2012-07-06T00:36:02.770 に答える
0

グーグルスタイルガイドを参照することにより、記録のために、すべての答えは正しいです:

これは間違いやすいので、使用を必要な場所に限定してください。 オブジェクトのメソッドの
コンストラクター(クロージャの作成を含む)

IMO、最善のアプローチはJoshの答えです。

于 2012-07-06T00:48:12.910 に答える
0

処理を回避する別の潜在的に効果的なアプローチはthis、コールバックパラメータを作成することです。

admin = function()
{
    this.testFunction = function()
    {
        alert('hello');
    }

    this.test2Function = function(successCallback)
    {
        $.ajax({
            url:'',
            success: function()
            {
                 if(typeof(successCallback) === 'function') {
                     successCallback(); 
                 }
            }
        });
     }
}

//usage:
admin.test2Function(admin.testFunction);
于 2016-04-13T15:07:21.867 に答える