Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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';s严格模式对于隐式全局声明到底做了什么?_Javascript_Strict - Fatal编程技术网

JavaScript';s严格模式对于隐式全局声明到底做了什么?

JavaScript';s严格模式对于隐式全局声明到底做了什么?,javascript,strict,Javascript,Strict,发件人: 首先,严格模式使得不可能意外地创建全局 变量。在普通JavaScript中,在赋值中错误键入变量 在全局对象上创建新属性并继续“工作” (尽管将来可能会失败:在现代JavaScript中很可能)。 赋值,这会意外地创建全局变量 在严格模式下抛出错误: 'use strict'; // Assuming a global variable mistypedVariable exists mistypeVariable = 17; // th

发件人:

首先,严格模式使得不可能意外地创建全局 变量。在普通JavaScript中,在赋值中错误键入变量 在全局对象上创建新属性并继续“工作” (尽管将来可能会失败:在现代JavaScript中很可能)。 赋值,这会意外地创建全局变量 在严格模式下抛出错误:

'use strict';
                       // Assuming a global variable mistypedVariable exists
mistypeVariable = 17;  // this line throws a ReferenceError due to the 
                       // misspelling of variable
这是什么意思引擎是否检测到具有类似名称的变量已存在(?!或者严格模式是否仅禁止在全局范围之外声明全局变量


上面的引文似乎暗示了第一种可能性,但这似乎。。。奇怪?

引用的代码中的注释具有误导性:“假设”部分无关紧要。它应该是这样的:“假设no全局变量与完全一致这个名称是用
let
var
定义的,…”

但是请注意代码片段和注释的目的是什么:表明在严格模式下更容易发现拼写错误。在“草率”模式下,拼写错误会被忽略(没有错误),并且您将在不知不觉中处理两个变量(至少有一段时间)

严格模式是否仅仅禁止在全局范围之外声明全局变量

严格模式绝对不禁止从任何地方声明全局变量。在非严格模式下,如果您写入:

someVar = 't';
它将评估:

window.someVar = 't';
()尽管写在函数范围内或函数范围外。实际上,这行代码同时声明和求值变量(再看看,它没有
var
,所以它不应该声明任何东西!)

但它会导致这样一个副作用,这并不是完全好的,他们已经引入了严格模式,当它处于活动状态时,我们的第一行将抛出一个错误。因为它只是一个评估,没有先声明

现在,如果需要在函数范围内操作全局范围,则只应将全局对象作为引用:

var someGlobalVar;
var someOtherGlobalVar;

function hello() {

    // this will make *someGlobalVar* to be redefined in the inner scope
    // someGlobalVar != window.someGlobalVar
    var someGlobalVar;

    // manipulating inner variable, not global one
    someGlobalVar = 's';


    // it's fine, you've accessed global object correctly
    window.someGlobalVar = 's';


    // you're still editing global object, because
    // there's no other variable inside of this scope having the same name
    someOtherGlobalVar = 's';

}

按照要求,我会将此作为一个答案:)

我想你已经理解了这里发生的事情,只是在读到关于“假设一个全局变量…”的引语时感到困惑。(我承认它的措辞可能会导致这种混淆。)实际情况非常简单,与具有“相似名称”的变量无关(JS对此没有概念):


我们正在讨论的是,如果您为尚未正式声明的变量赋值(变量是用关键字
var
let
const
之一声明的),会发生什么情况。不声明变量是不好的做法,在严格模式下会抛出错误-这是一件好事,并警告您的错误。但在非严格模式下,JS会欣然接受这一点,并认为您想要声明一个该名称的全局变量。这几乎不是您真正想要的,因为它污染了全局名称空间,不会通知您错误,并且可能会在以后导致各种棘手的错误。

我认为您的困惑来自于
mistypeVariable=17是正确的声明。它将处于草率模式,但在严格模式下,这不是一个变量创建,因此除非您已经为它设置了
let
var
,否则这是一个错误。我不确定我是否理解这个问题。在严格模式下,这将抛出一个错误。在“sloppy模式”中,它将隐式创建一个名为
mistypeVariable
的全局变量,其值为17——这几乎总是没有什么帮助的行为。(即使这个全局变量从来没有妨碍过你,也许它不会,你也不会意识到这个错误,直到后来你试图找出一些奇怪的错误。)@trincot(1)那么如何严格地声明全局变量呢?还是说严格禁止使用globals?(2) 根据我的引文:“假设存在一个全局变量mistypedVariable,这一行抛出一个ReferenceError”——强调我的。我的理解是,JS引擎因此必须检查类似的名称??我认为您的困惑源于对引用的代码段中的注释的解释过于字面化。该错误不会因为与另一个变量的“名称相似性”而抛出,而是纯粹因为您使用的是未声明的变量而抛出。您使用的其他变量名并不重要。引用代码中的注释具有误导性:“假设”部分与此无关。它应该是这样的:“假设没有使用
let
var
定义具有此名称的变量,…”但请注意代码片段和注释的目的是什么:为了表明在严格模式下更容易发现拼写错误。Upvote但不能将绿色勾号一分为二,抱歉:)