Javascript 为什么Chrome控制台和sublime的结果不同?这是用JS写的
我正在学习这个标识符,我知道当一个函数没有在一个对象上调用时,它指的是非严格模式下的窗口对象。因此,我希望this.bar记录“whatever” “whatever”是我在Chrome控制台中运行代码时的输出,但当我使用sublime中的节点构建系统运行代码时,输出是未定义的 为什么会这样?Chrome控制台中的结果正确吗?还有什么时候我会遇到这样的问题 这是我的密码Javascript 为什么Chrome控制台和sublime的结果不同?这是用JS写的,javascript,this,google-chrome-devtools,sublimetext,ecmascript-5,Javascript,This,Google Chrome Devtools,Sublimetext,Ecmascript 5,我正在学习这个标识符,我知道当一个函数没有在一个对象上调用时,它指的是非严格模式下的窗口对象。因此,我希望this.bar记录“whatever” “whatever”是我在Chrome控制台中运行代码时的输出,但当我使用sublime中的节点构建系统运行代码时,输出是未定义的 为什么会这样?Chrome控制台中的结果正确吗?还有什么时候我会遇到这样的问题 这是我的密码 function foo() { // console.log(this) console.log( this
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.
当您在节点中像这样声明变量
var bar='something'
时,您声明的不是全局变量,而是模块作用域变量。您应该使用global
对象来声明全局变量。大概是这样的:
global.bar = 'something';
我不是100%确定,但我假设这与Window对象有关。您定义的函数归全局窗口对象所有。可能节点生成系统没有此全局对象。在函数中使用此而不指定其他上下文时,它引用全局对象。在Chrome中,这将是
窗口
对象。在节点中,这称为global
。当我说指定一个不同的上下文时,例如,对构造函数使用new
,或者使用调用和apply
函数绑定一个特定的this
主要区别在于,当您使用var bar=“whatever”时
在节点中,使用var
将变量的范围限定到您正在编写的模块,而不是整个节点过程。在Chrome中,您将其范围限定到全局窗口对象。这与完全省略var
相同
我在下面添加了几个关于范围的例子,只是为了让它更清楚一点。在控制台中玩游戏是发现类似情况的一种很好的方式
示例1:
如您所见,调用test()
创建了一个全局作用域x
变量,发现此
引用的是窗口
变量
示例2:
在本例中,我们构建了一个新实例,它创建了一个新的范围。x
变量的作用域不是全局的。访问它的唯一方法是使用myInstance
上下文
至于你的问题,你有两个选择:
选项1(推荐):由于bar不是全局作用域,因此您不希望使用此
var bar = "whatever";
function foo() {
console.log(bar);
}
选项2(不推荐):
这会将变量设置为全局范围,因此您可以使用This
或global
global.bar = "whatever";
function foo() {
console.log(this.bar); // console.log(global.bar);
}
可能重复的