2015-07-10 68 views
7

我的印象是“this”关键字表示当前所有者在范围内。显然,这是错误的。让我得到的代码:全球功能中的“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 

上述第一警报[对象]窗口的代码,因为我希望,但那么接下来的两次调用P1()和p2()警惕“这个”为“未定义” 。对p1()和p2()的最后两次调用将“this”提醒为[object Window]。

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

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

+13

看起来像你在严格模式下运行脚本 –

+0

在Chrome控制台上运行良好..我得到'[object window]'所有警报! –

+0

问题是严格模式。运行您放置在此处的代码的行为与您预期的相同,并提醒所有警报的窗口 – atmd

回答

3

Becasue您使用strict mode按照规范:

如果这是在严格的模式码进行评估,则该值未强制转换为一个对象。

你有的代码不会在警报的所有实例alertwindow,而是因为你是在严格模式下,它是undefined(因为它应该是)

UPDATE:Chrome浏览器开发工具警报windowundefined,但是如果你在一个自执行的函数把它包起来你undefined预期

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

感谢您的澄清。我同意铬控制台(开发工具)它不警告“未定义”。让我困惑! –

+0

它让我困惑,奇怪的是,火狐使用'使用严格'从把它放在控制台,但丁当需要一个包装 – atmd

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明确

+0

这只是一个重复:) –

+0

@Kitler:哪个问题?此外,即使它是重复的,它也不会使我的答案无效。 –

+2

迄今为止的每个范围问题?你甚至有一个详细的规范关于他们...... –

0

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

例(伪代码):

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

什么这描述的是构造发生在一个叫做var1变种,并将它自己的变量var1它。

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

function p1() { alert(this); }

被称为p1();,它不是严格的对象范围内,因此this并不意味着什么。通过从窗口的上下文window.p1();中调用它,您正在使窗口对象调用该函数,因此给出了一个值this

+0

抱歉,但那不正确。这个问题是由严格模式造成的。在例子中,p1()和window.p1()是相同的东西,严格模式是什么影响'this'的值 – atmd