当我进入函数时,如何保持`this`的值?

时间:2012-07-06 00:34:06

标签: javascript scope

当我进入函数时,如何保留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;

但没有工作

5 个答案:

答案 0 :(得分:5)

您需要使用closure。在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();
   });
}

答案 1 :(得分: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内声明的所有内部函数和对象传递它的值。

答案 2 :(得分: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()         {         警报( '你好');         }

    var testFucntion = this.testFunction;

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

答案 3 :(得分:0)

所有答案都是正确的,只是为了记录,参考google style guide

  

因为这很容易出错,所以将其用途限制在那些地方   需要的地方:
            在建设者中             在对象的方法中(包括在创建闭包中)

IMO,最好的方法是Josh's answer

答案 4 :(得分: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);