【问题标题】:Why does "this.myFunction" not work when calling a function inside an object?为什么在对象内部调用函数时“this.myFunction”不起作用?
【发布时间】:2011-07-13 03:15:58
【问题描述】:

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

[我正在编写一个简单的游戏,使用一点 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”在匿名函数里面吗?

【问题讨论】:

    标签: javascript oop this


    【解决方案1】:

    在这个例子中:

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

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

    你可以做的是使用私有函数

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

    这样你就可以简单地在你的匿名函数中调用它

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

    【讨论】:

    • 所以在 JavaScript 中执行“var”就像在函数中将某些东西设为私有。这是有道理的。
    【解决方案2】:

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

    【讨论】:

    • "this 指的是封闭范围...this in the innermost function 指的是最里面的函数" 虽然它可能(或可能不会)改变每个函数,它不引用封闭范围,也不引用函数本身(除非你已经这样做了)。我们不知道如何 Cloud() 被调用,所以我们真的不知道this 在那个函数中是什么。
    • @patrick,说得好。我添加了一些关于它的附加信息。我意识到这可能仍然不是 100% 正确,但它是一种有用的思考方式。
    • 是的,this 在 javascript 中是如此奇怪的主题。至少有六种不同的事情需要考虑,它们可能会改变 this 的值。
    • 感谢理解,但再想一想,我的解释有点不对劲……让它更准确了。
    【解决方案3】:

    试试这个:

    function Cloud(){
    
        this.checkCloud = function(){
          alert('test');            
        }
    
        var func = this.checkCloud;
    
        $("#" + this.cloudName).click(function(){
             func();
         });
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 与 jQuery 无关,特别是与 JavaScript 无关。
      • @Michael:jQuery 手动设置 this 的值来引用调用处理程序的元素。如果 Cloud() 没有作为构造函数调用,并且我们将内部函数设置为一个典型的命名函数并调用它,那么代码将起作用,因为两个函数中的 this 将引用 window(除非你在严格模式)。 示例: jsfiddle.net/9NmPF/1
      猜你喜欢
      • 1970-01-01
      • 2023-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      相关资源
      最近更新 更多