为什么在调用对象内的函数时“this.myFunction”不起作用?

时间:2011-07-13 03:15:59

标签: javascript oop this

以下是两个代码示例。第一个不起作用,第二个起作用,尽管我完全不知道为什么。有人可以解释一下吗?

[我正在编写一个简单的游戏,使用一些jQuery在webkit浏览器中播放(稍后与Titanium一起打包)。]

在第一个例子中,Firebug告诉我“this.checkCloud”不是一个函数。

function Cloud(){

    this.checkCloud = function(){
      alert('test');            
    }

    $("#"+this.cloudName).click(function(){
        this.checkCloud();
    });

}

......但是这样可行:

function Cloud(){

    this.checkCloud = function(){
      alert('test');            
    }

    var _this = this;

    $("#"+this.cloudName).click(function(){
        _this.checkCloud();
    });

}

这个很完美。

为什么第一个不起作用?是因为“this.checkCloud”在匿名函数内部吗?

4 个答案:

答案 0 :(得分:2)

这是因为每次通过函数创建新范围时this的含义都可能发生变化。 this的含义取决于函数的调用方式(规则可能非常复杂)。正如您所发现的,简单的解决方案是创建第二个变量,将this保存在this具有预期/期望值的范围内,然后重用该变量而不是thisthis可能不同的新函数范围中引用相同的对象。

答案 1 :(得分:2)

在这个例子中

$("#"+this.cloudName).click(function(){
        this.checkCloud();
    });

this引用所选元素(jquery对象)。

你可以做的是使用私人功能

var checkCloud = function(){
      alert('test');            
    }

这样你只需在你的匿名函数中调用它

$("#"+this.cloudName).click(function(){
            checkCloud();
        });

答案 2 :(得分:1)

试试这个:

function Cloud(){

    this.checkCloud = function(){
      alert('test');            
    }

    var func = this.checkCloud;

    $("#" + this.cloudName).click(function(){
         func();
     });
}

答案 3 :(得分:0)

当您为元素分配偶数侦听器时,jQuery会确保this将引用该元素。但是当你创建_this变量时,你正在创建一个jQuery无法解决的闭包,即使它想要。