为啥在 javascript 中是 = this? [复制]

Posted

技术标签:

【中文标题】为啥在 javascript 中是 = this? [复制]【英文标题】:Why is that = this in javascript? [duplicate]为什么在 javascript 中是 = this? [复制] 【发布时间】:2015-08-10 03:51:43 【问题描述】:

我有这样的 js 代码的 sn-p

Customer.prototype.parseAddress = function(data)
   this.address = data.address;

Customer.prototype.loadAddress = function()
   ...

我需要实现 loadAddress 函数。

谁能解释一下为什么这段代码是正确的

var that = this;
$.get('data.xml', function(data)
    that.parseAddress(data);
);

以下是不正确的

$.get('data.xml', function(data)
    this.parseAddress(data);
);

【问题讨论】:

很难说,因为没有足够大的图片。 “this”指的是封装对象。根据您调用它的位置(或将其分配给变量),它将引用它在其中调用的任何对象。 this inside success $.get() 回调指的是jqXHR对象 取决于它在代码中更改的位置。它是执行上下文。在函数内部,执行上下文与之前不同 这太复杂了,所以你需要在 javascript 中阅读范围。 【参考方案1】:

问题是,当你调用一个函数时,你需要传递函数的上下文,否则,上下文将是查询指定的新上下文。您应该检查以下概念(调用、应用和绑定)。

你可以写:

 $.get('data.xml', function(data)
   this.parseAddress(data);
.bind(this));

研究它的一个很好的链接参考是: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_objects/Function/bind

【讨论】:

对不起。你不能使用 call 或 apply,我只是想帮助他解决类似的概念。 谢谢,这个信息很有帮助。 @PedroAugusto 别担心,这以某种方式回答了这个问题;)【参考方案2】:

在 Javascript 中,this 是一个特殊的上下文关键字,会根据您使用它的位置而变化。

通过that = this;,您保存了this 的含义,因此您无需担心this 是否意味着您认为的含义。

my_func = function() 
  var that = this;
  console.log(this); //prints one thing

  my_inner_func = function()
    
      console.log(this); //prints another
      console.log(that); //prints what the first log printed
    
  my_inner_func();

【讨论】:

你能简单解释一下this本身是什么吗? 结帐developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。它在 Python 中基本上是 self.,但会根据其嵌套深度改变 self 指向的内容。【参考方案3】:

这是因为this 是上下文相关的,可以在回调中更改。

我所说的语句是

this.parseAddress

parseAddress 已在 this 上定义。然而,当回调函数被调用时,this 可能不是你期望的对象,jQuery 做了很多。因此,您无法从回调中访问原始 this 的其他属性。

处理它的最简单方法是保留对原始this 的引用,方法是将其存储在that 中。现在您可以随时引用原始对象并访问更多属性,因为在 jQuery 回调范围内可以访问 that 中的原始引用。

【讨论】:

想解释一下否决票?我不确定答案有什么问题?

以上是关于为啥在 javascript 中是 = this? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在javascript中为啥使用“ var that = this” [重复]

为啥使用javascript函数包装器(在coffeescript中添加)“.call(this)”

将函数放入 javascript 对象中是一种好习惯吗? [复制]

为啥我的带有“$(this).next”的 JavaScript/jQuery 脚本不起作用?

为啥我的图像不会显示在 javascript 画布上?

Javascript 中的 this