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 var 上

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 :)
            }
        });
     }
}

函数中定义的所有局部变量,通过整个函数传播(可以访问),包括该函数中定义的所有函数。

因此var top = this;,它将通过所有内部函数和在admin.

于 2012-07-06T00:36:06.327 回答
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 回答