Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么Chrome控制台和sublime的结果不同?这是用JS写的_Javascript_This_Google Chrome Devtools_Sublimetext_Ecmascript 5 - Fatal编程技术网

Javascript 为什么Chrome控制台和sublime的结果不同?这是用JS写的

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

我正在学习这个标识符,我知道当一个函数没有在一个对象上调用时,它指的是非严格模式下的窗口对象。因此,我希望this.bar记录“whatever”

“whatever”是我在Chrome控制台中运行代码时的输出,但当我使用sublime中的节点构建系统运行代码时,输出是未定义的

为什么会这样?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.

当您在节点中像这样声明变量
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);
}
可能重复的