"这"在全球职能

时间:2015-07-10 12:15:55

标签: javascript this

我的印象是"这个" keyword表示范围内的当前所有者。显然,这是错误的。让我来看看代码:

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

上面的代码首先警告[对象窗口],正如我所料,但接下来两次调用p1()和p2()警告"这" as" undefined"。最后两次调用p1()和p2()警告"这"作为[对象窗口]。

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

以我的(C#)思维方式,p1()和p2()属于全局范围。这些函数是全局窗口对象的成员,所以当它们引用"这个"他们应该指[object Window]。显然,我在这里非常错误。

3 个答案:

答案 0 :(得分:3)

请注意您使用的是strict mode并且符合规范:

  

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

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

更新:chrome dev工具提醒window而不是undefined,但如果将其包装在自动执行功能中,则会按预期获得undefined

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

答案 1 :(得分: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.   
  3. 否则如果thisArg为null或未定义,则将ThisBinding设置为全局对象。
  4.   
  5. 否则如果Type(thisArg)不是Object,则将ThisBinding设置为ToObject(thisArg)。   ...
  6.   

正如你所看到的那样,"松散"模式,如果thisArgundefined,如果你调用函数"通常"如foo(),它将明确地设置为window

答案 2 :(得分:0)

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

示例(伪代码):

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

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

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

function p1() { alert(this); }

被称为p1();,它不是严格地在对象上下文中,因此this并不意味着什么。通过从窗口的上下文window.p1();调用它,您正在使窗口对象调用该函数,从而为this提供值。