Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.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 如何保持';这';在jquery中_Javascript_Jquery_This - Fatal编程技术网

Javascript 如何保持';这';在jquery中

Javascript 如何保持';这';在jquery中,javascript,jquery,this,Javascript,Jquery,This,我有这样的想法: var Something = function(){ this.render = function(){}; $(window).resize(function(){ this.render(); }); } 问题在于,在匿名函数中,“this”指的是窗口对象。我知道我可以这样做: var Something = function(){ this.render = function(){}; var tempThis = this; $(wi

我有这样的想法:

var Something = function(){
  this.render = function(){};
  $(window).resize(function(){
    this.render();
  });
}
问题在于,在匿名函数中,“this”指的是窗口对象。我知道我可以这样做:

var Something = function(){
  this.render = function(){};
  var tempThis = this;
  $(window).resize(function(){
    tempThis.render();
  });
}

但是有更好的办法吗?这看起来不太优雅。

这看起来是你最好的选择,我想没有更好的办法了。(如果我错了,有人会纠正我的错误)。

我在很多紧急情况下都是这样做的。它看起来并不优雅,但它从不失败。实际上,这就是javascript闭包的作用


jrh

您找到的解决方案是大多数人使用的解决方案。通常的惯例是将您的变量称为this变量“that”


仅供参考,控制这一点的能力将出现在我所做的事情中。它也不是特定于jQuery的

var Construct = function() {
    var self = this; //preserve scope

    this.materials = 2000;

    this.build = function(){
        self.materials -= 100;
    };
};

记住在新的范围变量前面使用var关键字。否则,您将创建一个新的全局变量。作为局部变量,它仍然可以通过闭包在内部函数中访问。

将变量保持在最小值的最佳解决方案是使用function.prototype.bind()方法

此方法的问题可能会导致将来的复杂性,这意味着您应该选择谨慎地使用它,当您需要调用
$(this)
来获取元素时。因此,我可能建议在调整大小的方法中使用
Function.prototype.bind()
,这是值得的,但在可能需要直接针对单击的元素的单击函数中使用它并不是一个好的解决方案

请参见下面的工作示例

有关更多信息,请参阅


其他方法是可用的,但根据您的问题,创建一个变量来维护上下文是不希望出现的效果。

您应该在“testhis=this”之前添加一个“var”,以确保适当的范围。好吧,有一个约定会使它看起来更优雅:)我喜欢“that”.+1=这个->这是我在这个问题上找到的最优雅的方法。道格拉斯·克罗克福德的道具,如果不是发明的话,也是推广这个惯例的道具。:-)请在“that”之前添加一个“var”,以避免您的变量影响全局范围。另一个约定是将这个变量称为“self”。我以前使用“self”,直到我注意到浏览器中有一个名为“self”的全局变量,它有时引用全局对象。如果您键入了某个内容,您的this将再次成为全局对象,并且不会抛出任何错误,而且更难跟踪,因为看起来您做了正确的事情,但无论如何它做了错误的事情!
var Construct = function() {
    var self = this; //preserve scope

    this.materials = 2000;

    this.build = function(){
        self.materials -= 100;
    };
};
var Something = function(){
  this.render = function(){};
  $(window).resize( this.render.bind( this ) );
}