【问题标题】:"this" in global functions全局函数中的“this”
【发布时间】:2015-09-29 04:33:58
【问题描述】:

我的印象是“this”关键字代表范围内的当前所有者。显然,这是错误的。让我来看看代码:

alert(this);     // alerts as [object Window] -- Okay

function p1() {
    alert(this);
}

var p2 = function() {
    alert(this);
}

p1();           // alerts as undefined  -- ???
p2();           // alerts as undefined  -- ??
window.p1();    // alerts as [object Window] -- Okay
window.p2();    // alerts as [object Window] -- Okay

如我所料,上面的代码首先警告 [object Window],但接下来对 p1() 和 p2() 的两次调用将“this”警告为“undefined”。最后两次调用 p1() 和 p2() 将“this”作为 [object Window]。

p1() 和 p2() 不是存在于全局(即窗口)范围内吗?我认为调用window.p1() 是调用p1() 的同义词,就像调用alert() 是window.alert() 的同义词一样。

在我的 (C#) 思维方式中,p1() 和 p2() 都在全局范围内。这些函数是全局窗口对象的成员,因此当它们引用“this”时,它们应该是指 [object Window]。很明显,我在这里大错特错。

【问题讨论】:

  • 看起来你是在严格模式下运行脚本
  • 在 Chrome 控制台上运行良好。我收到 [object Window] 的所有警报!
  • 问题是严格模式。运行您在此处放置的代码会按照您的预期运行所有警报的警报窗口
  • 刚刚更新了我的答案 回复:chrome给窗口而不是未定义,似乎它可以在sef中找到而不是输入控制台

标签: javascript this


【解决方案1】:

因为您使用的是 strict mode 并且按照规范:

如果 this 在严格模式代码中进行评估,则 this 值不会被强制转换为对象。

您拥有的代码确实在所有警报实例中都有alert window,但因为您处于严格模式,所以它是undefined(应该是)

更新:chrome 开发工具警报 window 不是 undefined,但是如果你将它包装在一个自执行函数中,你会得到 undefined 预期

(function(){
   'use strict';
   alert(this);
}());

【讨论】:

  • 感谢您的澄清。我同意 chrome 控制台(开发工具)它不会提醒“未定义”。把我弄糊涂了!
  • 这让我很困惑,奇怪的是 firefox 使用了 'use strict' 将其放入控制台但 chome 需要一个包装器
【解决方案2】:

当你调用像foo()这样的函数时,this的值取决于代码是否在strict mode中运行(实际上是默认值)。

在严格模式下,this 将是 undefined(正如您已经发现的那样)。

在“松散模式”下,this 确实会引用window,但这不是,因为这些函数是全局的,即由全局范围“拥有”。对于本地函数,您会得到相同的行为:

(function() {
  function foo() {
    console.log(this); // logs the window object, but `foo` is not global
  }
  foo();
}());

这只是一个explicitly defined behavior

  1. 如果功能码是严格码,设置ThisBinding为thisArg。
  2. 否则,如果 thisArg 为 null 或未定义,请将 ThisBinding 设置为全局对象。
  3. 否则,如果 Type(thisArg) 不是 Object,则将 ThisBinding 设置为 ToObject(thisArg)。 ...

如你所见,在“松散”模式下,如果thisArgundefined,如果你把函数“正常”调用为foo(),那么它将被设置为window 明确地。

【讨论】:

  • 这只是复制品:)
  • @Kitler:哪个问题?此外,即使它是重复的,也不会使我的答案无效。
  • 迄今为止的每个范围问题?你甚至有关于它们的详细规范......
  • @Kitler:如果您指的是当前声称是重复的问题,那么,它不是。链接的问题是关于this,是的,但它是关于不同的问题。
  • @Kitler 不是真的.. 他们主要解释 call/apply/bind 而不是严格模式
【解决方案3】:

this 表示您指的是您所指的那个对象。它主要用于面向对象编程中,用于区分对象的自身变量和输入变量。

示例(伪代码):

var1 //instance variable of object void Constructor(var1){ this.var1 = var1 }

这里描述的是构造函数接受一个名为var1的变量,并将它自己的变量var1设置为它。

在你的情况下,我会假设在函数中:

function p1() { alert(this); }

被称为p1();,它并不严格位于对象上下文中,因此this 没有任何意义。通过从窗口的上下文window.p1(); 调用它,您正在使窗口对象调用该函数,因此给this 一个值。

【讨论】:

  • 对不起,那是不正确的。问题是由严格模式引起的。在示例中 p1() 和 window.p1() 是同一件事,严格模式是影响this的值的原因@
猜你喜欢
  • 1970-01-01
  • 2011-09-30
  • 2020-02-20
  • 2019-11-14
  • 2016-12-10
  • 1970-01-01
  • 2012-11-05
  • 2019-03-02
  • 2013-05-23
相关资源
最近更新 更多