1

我正在学习关于这个标识符,我知道,当一个函数是不是在对象上调用那么这指的是在非严格模式的窗口对象。因此,我期望this.bar记录“无论如何”。为什么Chrome控制台中的结果与崇高不同?这JS

“无所谓”是输出,当我跑我在Chrome console.it代码,但输出是不确定的,当我使用节点构建系统崇高我的代码运行。

为什么是这样呢?我确定Chrome控制台的结果是正确的吗?还有什么时候可以遇到这样的问题?

这里是我的代码

function foo() { 
    // console.log(this) 
    console.log(this.bar); 
} 

var bar = "whatever"; 


// -------- 

foo();    // OUTPUT is "whatever" in the Chrome console and OUTPUT is undefined in Sublime's Node build system. 
+1

可能重复[“this”关键字是如何工作的?](http://stackoverflow.com/questions/3127429/how-does-the-this-keyword-work) – Claies

回答

1

当你在一个函数中使用this没有指定一个不同的上下文,它指的是全局对象。在Chrome中,这将是window对象。在Node中,这被称为global。当我说指定不同的上下文中,这将是,例如,使用用于new一个构造函数,或callapply功能结合特定this

主要区别在于,当您在节点中使用var bar = "whatever";时,使用var将变量作用于您正在编写的模块,而不是整个节点进程。在Chrome中,你就作用域全球window对象。这与完全忽略var一样。

我在下面添加了一些关于范围的例子,只是为了让它更清楚些。在控制台中玩耍是发现这种事物的好方法。

实施例1: Example 1 正如你可以看到,主叫test()创建了全球范围x可变的,并且this被发现是指window变量。

实施例2: Example 2 在这个例子中,我们构建了一个新的实例,它创建了一个新的范围。变量x不在全局范围内。访问它的唯一方法是使用myInstance上下文。

至于你的问题,你有两个选择:

选项1(推荐):由于栏中没有全局范围,你不想访问使用this

var bar = "whatever"; 

function foo() { 
    console.log(bar); 
} 
全局变量

选项2(不推荐): 这将设置变量是在全球范围内,因此您可以使用thisglobal

global.bar = "whatever"; 

function foo() { 
    console.log(this.bar); // console.log(global.bar); 
} 
0

当你在这样var bar = 'something'节点声明变量声明它不是全球性的,但模块作用域。您应该使用global对象来声明全局变量。事情是这样的:

global.bar = 'something'; 
0

我不是100%肯定,但我假设它的东西做的Window对象。您定义的功能属于全局窗口对象。也许节点构建系统没有这个全局对象。

相关问题