Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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
函数内部没有var的JavaScript变量在全局执行上下文中不可用_Javascript_Google Chrome_Google Chrome Devtools_Strict Mode - Fatal编程技术网

函数内部没有var的JavaScript变量在全局执行上下文中不可用

函数内部没有var的JavaScript变量在全局执行上下文中不可用,javascript,google-chrome,google-chrome-devtools,strict-mode,Javascript,Google Chrome,Google Chrome Devtools,Strict Mode,我在kyle simpson的一门javascript课程中了解到,如果我们在javascript函数中声明一个变量而不使用任何前缀var关键字,那么该变量在全局执行上下文中可用,但当我在chrome developer tool或nodejs中尝试时,它会抛出ReferenceError: 有什么变化吗 在Windows和Linux上的Firefox和Chrome中都会发生这种情况 函数foo(){ bar=“我在全球范围内”; } foo(); 控制台日志(bar); 有什么变化吗 不在

我在kyle simpson的一门javascript课程中了解到,如果我们在javascript函数中声明一个变量而不使用任何前缀var关键字,那么该变量在全局执行上下文中可用,但当我在chrome developer tool或nodejs中尝试时,它会抛出ReferenceError:

有什么变化吗

在Windows和Linux上的Firefox和Chrome中都会发生这种情况

函数foo(){
bar=“我在全球范围内”;
}
foo();
控制台日志(bar);
有什么变化吗

不在松散模式下,不,也不会。JavaScript的指导委员会TC39非常正确地意识到向后兼容性

在严格模式下,该代码会失败,因为
bar
在分配给它的位置未声明

您已经说过,您在Chrome的控制台和Node.js的REPL中看到了这一点。我在这两种情况下都看到
未定义
,但这是因为这些环境在显示
条后显示调用
控制台.log
(即
未定义
。我首先看到
“我在全局范围内”
,然后看到
未定义的
(调用
控制台.log的结果)


那就是说,不要用控制台来做这种事情。:-)控制台是一个非常特殊的环境,特别是在范围内,因为它们具有交互性质。如果您想知道某些东西是如何工作的,甚至是与作用域相关的,最好是在实际的文件或脚本中复制它,而不是在控制台中复制。

我无法重现问题,但不要这样做。隐式全局变量很糟糕(在严格模式下是禁止的,总是使用严格模式)。这个问题在Chrome开发工具中是可以重现的。但在片段中并非如此。无论如何,你根本不应该这样做,它应该在客户端和服务器上都有控制台,但是这是一种糟糕的做法,“有什么变化吗?”不是在松散模式下,没有,也不会。JavaScript的指导委员会TC39非常正确地意识到向后兼容性。在严格模式下,该代码会失败,因为
bar
未声明您分配给它的位置。我理解这不是一个好做法,我们应该使用严格模式。但我只是想验证凯尔在会议上说的话。我在终端中使用node命令和chrome控制台运行这个命令,这似乎表明chrome devtools确实从草率模式变为严格模式了?它在Chrome 75.0.3770.142中没有错误。正确,我的是Chrome 55.0.2883。87@Bergi-不,据我所知,控制台没有切换到严格模式。我以为OP看到的是
未定义的
,而不是
“我在全球范围内”
,我狡猾的眼睛也让我在Chrome控制台上错过了它。但我认为他们只是缺少了
“我在全球范围内”
的输出。@finepax007-见上文,并编辑了答案。@T.J.Crowder,我希望我能:),我升级chrome的帮助热线通知单自最近几个月以来仍处于挂起状态:)