Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “为什么?”;这个.myFunction“;在对象内部调用函数时不起作用?_Javascript_Oop_This - Fatal编程技术网

Javascript “为什么?”;这个.myFunction“;在对象内部调用函数时不起作用?

Javascript “为什么?”;这个.myFunction“;在对象内部调用函数时不起作用?,javascript,oop,this,Javascript,Oop,This,下面是两个代码示例。第一个坏了,第二个坏了,尽管我完全不知道为什么。有人能解释一下吗 [我正在编写一个简单的游戏,使用一点jQuery在webkit浏览器中玩(稍后用Tianium打包)。] 在第一个例子中,Firebug告诉我“this.checkCloud”不是一个函数 function Cloud(){ this.checkCloud = function(){ alert('test'); } $("#"+this.clou

下面是两个代码示例。第一个坏了,第二个坏了,尽管我完全不知道为什么。有人能解释一下吗

[我正在编写一个简单的游戏,使用一点jQuery在webkit浏览器中玩(稍后用Tianium打包)。]

在第一个例子中,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”在匿名函数中吗?

当您将偶数侦听器分配给元素时,jQuery确保
将引用该元素。但是,当您创建
\u这个
变量时,您正在创建一个jQuery无法处理的闭包,即使它想处理。

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

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

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

在本例中:

$("#"+this.cloudName).click(function(){
        this.checkCloud();
    });
引用所选元素(jquery对象)

你能做的就是使用私有函数

var checkCloud = function(){
      alert('test');            
    }
通过这种方式,您只需在匿名函数中调用它

$("#"+this.cloudName).click(function(){
            checkCloud();
        });
在本例中:

$("#"+this.cloudName).click(function(){
        this.checkCloud();
    });
引用所选元素(jquery对象)

你能做的就是使用私有函数

var checkCloud = function(){
      alert('test');            
    }
通过这种方式,您只需在匿名函数中调用它

$("#"+this.cloudName).click(function(){
            checkCloud();
        });
试试这个:

function Cloud(){

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

    var func = this.checkCloud;

    $("#" + this.cloudName).click(function(){
         func();
     });
}
试试这个:

function Cloud(){

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

    var func = this.checkCloud;

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

特别是与jQuery无关,而与JavaScript无关。@Michael:jQuery手动设置
this
的值以引用调用处理程序的元素。如果未将
Cloud()
作为构造函数调用,并且我们使内部函数只是一个典型的命名函数,并调用了它,那么代码将正常工作,因为这两个函数中的
都将引用
窗口
(除非您处于严格模式)。示例:与jQuery无关,而与JavaScript无关。@Michael:jQuery手动设置
this
的值以引用调用处理程序的元素。如果未将
Cloud()
作为构造函数调用,并且我们使内部函数只是一个典型的命名函数,并调用了它,那么代码将正常工作,因为这两个函数中的
都将引用
窗口
(除非您处于严格模式)。示例:“
this
t表示封闭范围…
this
在最里面的函数中指的是最里面的函数”虽然它可能(也可能不)随每个函数而改变,但它不指封闭范围,也不指函数本身(除非您已经这样做)。我们不知道如何调用
Cloud()
,所以我们不知道该函数中的
是什么。@patrick,说得好。我添加了一些关于它的附加信息。我意识到这可能仍然不是100%正确,但这是一种很有用的思考方式。是的,
这在javascript中是一个很奇怪的主题。至少有六个不同的事情需要考虑,这可能会改变<代码>这个<代码>值。谢谢理解,但是在思考了一些之后,我的解释很不好。使其更准确。“
t指封闭范围…
在最里面的函数中指最里面的函数”虽然它可能(也可能不)随每个函数而改变,但它不指封闭范围,也不指函数本身(除非您已经这样做)。我们不知道如何调用
Cloud()
,所以我们不知道该函数中的
是什么。@patrick,说得好。我添加了一些关于它的附加信息。我意识到这可能仍然不是100%正确,但这是一种很有用的思考方式。是的,
这在javascript中是一个很奇怪的主题。至少有六个不同的事情需要考虑,这可能会改变<代码>这个<代码>值。谢谢理解,但是在思考了一些之后,我的解释很不好。所以在JavaScript中,如果在函数中使用“var”,就如同将某些东西设置为私有。这是有道理的。所以在JavaScript中,如果函数中的某个东西是私有的,那么执行“var”就像是私有的。这是有道理的。