8506

最近,我通过Crockford运行了一些JavaScript代码JSLint公司,并给出以下错误:

第1行字符1处的问题:缺少“use strict”语句。

搜索时,我发现有些人会添加“严格使用”;到他们的JavaScript代码中。我添加了该语句后,错误就不再出现了。不幸的是,谷歌并没有透露该字符串语句背后的很多历史信息。当然,这一定与浏览器如何解释JavaScript有关,但我不知道会有什么影响。

那么什么是“使用严格”;所有这些,它意味着什么,它还相关吗?

当前的浏览器是否响应“使用严格”;字符串还是供将来使用?

7
  • 74
    这里的答案很古老,但它们是错误的。strict模式的主要原因不是为了防止编程错误,而是为了使JavaScript具有词汇范围,以便可以进行静态分析:] 评论 2019年9月6日11:40
  • 5
    奇怪语法(作为语句的魔法字符串)的原因是为了使其向后兼容旧的JavaScript引擎。严格模式的思想是不允许一些有问题的JavaScript语言构造,但不更改代码的解释,这样无论JavaScript引擎是否真正支持严格模式,执行都是相同的。 评论 2022年9月30日7:11
  • 2
    @Benjamin Gruenbaum,但使其可静态分析的原因是,可以通过工具对其进行分析,以防止编程错误 评论 4月22日8:37
  • @OrangeDog不,它是静态分析谷歌的广告代码以防止注入和沙盒escpe-参见static.googleusercontent.com/media/research.google.com/en//pubs/… 评论 4月24日17:53
  • 2
    @Benjamin Gruenbaum这些是编程错误 评论 4月24日23:01

32个答案32

重置为默认值
5514

ES6模块更新

内部本机ECMAScript模块(带有进口出口声明)和ES6类,严格模式始终处于启用状态,无法禁用。

原始答案

这篇关于Javascript Strict Mode的文章可能会让您感兴趣:John Resig-ECMAScript 5严格模式、JSON等

引用一些有趣的部分:

严格模式是ECMAScript 5中的一个新功能,它允许您将程序或函数放置在“严格”的操作上下文中。这种严格的上下文阻止执行某些操作,并引发更多异常。

并且:

严格模式有两种帮助:

  • 它捕获一些常见的编码错误,引发异常。
  • 当采取相对“不安全”的操作(例如访问全局对象)时,它可以防止或引发错误。
  • 它禁用了令人困惑或考虑不周的功能。

还请注意,您可以对整个文件应用“严格模式”。。。或者您只能将其用于特定功能(仍引用John Resig的文章):

//非严格代码。。。(函数(){“使用严格”;//严格定义库。。。})();//非标准代码。。。

如果您必须混合新旧代码,这可能会有所帮助;-)

所以,我想这有点像“使用严格”可以在Perl中使用(因此得名?):它通过检测更多可能导致损坏的东西,帮助您减少错误。

现在是严格模式所有主要浏览器都支持.

0
1438

这是ECMAScript 5的一个新特性。John Resig写道很好的总结它的。

它只是您放入JavaScript文件中的一个字符串(位于文件顶部或函数内部),如下所示:

“使用严格”;

现在将其放入代码中不应导致当前浏览器出现任何问题,因为它只是一个字符串。如果您的代码违反了杂注,则将来可能会导致代码出现问题。例如,如果您当前有foo=“bar”没有定义foo公司首先,您的代码将开始失败。。。在我看来,这是一件好事。

0
874

声明“使用严格”;指示浏览器使用Strict模式,这是JavaScript的一个简化且安全的功能集。

功能列表(非详尽)

  1. 不允许全局变量。(抓钩缺失无功功率,无功功率变量名中的声明和输入错误)

  2. 无声失败的分配将在严格模式下引发错误(分配NaN=5;)

  3. 尝试删除不可删除的属性将引发(删除对象.原型)

  4. 要求对象文本中的所有属性名称都是唯一的(varx={x1:“1”,x1:“2”})

  5. 函数参数名称必须唯一(函数和(x,x){…})

  6. 禁止八进制语法(var x=023;一些开发人员错误地认为前面的零不会改变数字。)

  7. 禁止具有关键字

  8. 评估在strict模式下不引入新变量

  9. 禁止删除普通名称(删除x;)

  10. 禁止绑定或分配名称评估论据以任何形式

  11. 严格模式不别名论据具有形式参数的对象。(例如in函数sum(a,b){返回参数[0]+b;}这起作用是因为参数[0]已绑定到等等。)(请参见示例了解差异)

  12. 参数.被叫不支持

[参考:严格模式,Mozilla开发者网络]


示例:

  1. 严格模式代码不别名在其中创建的参数对象的属性
功能显示(消息){消息=42;控制台.log(消息);//消息===42console.log(参数[0]);//参数===42}秀(“嘿”);//在严格模式下,参数[i]不跟踪的值//相应的命名参数,命名参数也不跟踪相应参数[i]中的值函数showStrict(消息){“使用严格”;消息=42;控制台.log(消息);//消息===42console.log(参数[0]);//arguments===“嘿”}showStrict(“嘿”);
  • 10
    11的例子。尚不清楚,也不清楚严格模式的区别是什么。
    – 罗布·G
    评论 2021年3月11日23:36
  • 1
    “不允许全局变量”的表述具有误导性。全局变量仍然可以使用无功功率,无功功率,常数在全局范围内或通过分配给窗户什么的(使用窗口显式),不允许将属性隐式添加到窗口通过做某物哪里某物未声明(未显式使用窗口).
    – 唐老鸭
    评论 2022年10月27日16:06
  • 这是一个比公认的答案好得多的答案,因为它直接进入了细节,而没有对John Resig的帖子进行元评论。 评论 2月6日4:42
490

如果人们担心使用使用严格这篇文章可能值得一看:

浏览器中的ECMAScript 5“严格模式”支持。这是什么意思?
NovoGeek.com-Krishna的博客

它谈到了浏览器支持,但更重要的是如何安全地处理:

函数isStrictMode(){返回!这;} /*返回false,因为“this”指的是全局对象'!这个'变为假*/函数isStrictMode(){“使用严格”;返回!这;} /* 返回true,因为在严格模式下关键字“this”与传统JS不同,它不引用全局对象。所以这里,“this”是“undefined”和“!”!这变成了事实。*/
0
268

一句忠告,你们这些精力充沛的程序员:申请“使用严格”对现有代码来说可能是危险的!这并不是一个让人感觉良好、面带幸福感的贴纸,你可以把它贴在代码上,让它变得“更好”。使用“使用严格”pragma,浏览器会突然在以前从未抛出的随机位置抛出异常,因为在那个位置,您正在做默认/松散JavaScript允许但严格JavaScript不允许的事情!您可能会在代码中很少使用的调用中隐藏严格性违规,这些调用只有在最终运行时才会抛出异常-例如,在付费客户使用的生产环境中!

如果你打算冒险,最好申请“使用严格”除了全面的单元测试和一个严格配置的JSHint构建任务之外,这将使您相信,模块中没有任何黑暗角落会因为您启用了严格模式而爆炸。或者,嘿,这里有另一个选择:不要添加“使用严格”老实说,对于任何遗留代码来说,这样做可能更安全。绝对不要添加“使用严格”对于您不拥有或维护的任何模块,如第三方模块。

我认为,尽管它是一种致命的笼中动物,“使用严格”可能是好东西,但你必须做好。严格执行的最佳时机是当您的项目是新建项目,并且您正在从头开始。配置JS提示/JSLint在所有警告和选项都尽可能紧张的情况下,您的团队可以接受这样一个良好的构建/测试/断言系统咕噜+业力+柴,然后才开始将所有新模块标记为“使用严格”.准备好纠正许多棘手的错误和警告。如果出现以下情况,请将构建配置为FAIL,以确保每个人都理解重力JS提示/JSLint产生任何违规行为。

当我采用时,我的项目不是一个新项目“使用严格”。因此,我的IDE充满了红色标记,因为我没有“使用严格”在我的一半模块上,JSHint对此表示不满。这提醒了我以后应该做什么重构。我的目标是因为我所有的缺失而没有红色标记“使用严格”声明,但那是几年后的事了。

0
264

使用'使用严格';不会突然让代码变得更好。

这个JavaScript严格模式是中的功能ECMA脚本5。您可以通过在脚本/函数顶部声明来启用严格模式。

'使用严格';

当JavaScript引擎看到这一点时指令,它将开始以特殊模式解释代码。在这种模式下,当检测到某些可能最终成为潜在错误的编码实践时,就会出现错误(这就是严格模式背后的原因)。

考虑这个例子:

变量a=365;变量b=030;

在他们痴迷于排列数字文字时,开发人员无意中初始化了变量b带有八进制文字。非标准模式将其解释为带值的数字文字24(以10为基数)。然而,严格模式将抛出错误。

有关严格模式下的非详尽专业列表,请参阅这个答案.


我应该在哪里使用“严格使用”;?

  • 在我的新的JavaScript应用程序:当然!当您在代码中做一些愚蠢的事情时,可以使用严格模式作为告密者。

  • 在我的现有的JavaScript代码:可能不会!如果您现有的JavaScript代码包含严格模式中禁止的语句,那么应用程序将完全中断。如果您想要严格模式,您应该准备调试和更正现有代码。这就是为什么使用'使用严格';不会突然让代码变得更好.


如何使用严格模式?

  1. 插入一个'使用严格';脚本顶部的语句:

    //文件:myscript.js“严格使用”;变量a=2;....

    请注意,文件中的所有内容myscript.js(myscript.js)将以严格模式解释。

  2. 或者,插入'使用严格';函数体顶部的语句:

    函数doSomething(){'使用严格';...}

    中的所有内容词汇范围函数的做点什么将以严格模式解释。这个词词汇范围在这里很重要。例如,如果您的严格的代码调用库的函数不严格,只有您的代码在严格模式下执行,而不是被调用的函数。请参见这个答案以获得更好的解释。


严格禁止哪些事情?

我发现了一个好文章描述了严格模式下禁止的几件事(注意,这并不是一个详尽的列表):

范围

从历史上看,JavaScript一直被混淆于其功能确定了范围。有时它们似乎是静态范围的,但有些这些特性使它们的行为类似于动态范围。这是令人困惑,使程序难以阅读和理解。误解会导致错误。这也是一个性能问题。静态范围将允许在编译时进行变量绑定时间,但对动态范围的要求意味着绑定必须推迟到运行时,这会带来显著的性能处罚。

严格模式要求所有变量绑定都是静态的。这意味着以前需要动态绑定的功能必须删除或修改。具体来说,with语句是以及eval函数篡改呼叫方的环境受到严格限制。

严格代码的好处之一是YUI压缩机在处理时可以做得更好。

隐含的全局变量

JavaScript具有隐含的全局变量。如果您没有显式声明变量,全局变量是为您隐式声明。这使得编程更容易初学者,因为他们可以忽略一些基本的家务家务活。但它使大型项目的管理变得更加重要这很困难,并且会显著降低可靠性。所以严格来说模式下,不再创建隐含的全局变量。你应该显式声明所有变量。

全球泄漏

有许多情况可能导致以绑定到全局对象。例如,如果你忘记了提供新的调用构造函数时使用前缀建造师的将意外绑定到全局对象,因此它将以静默方式代替初始化新对象篡改全局变量。在这些情况下,严格模式将而是绑定未定义,这将导致构造函数相反,抛出一个异常,使错误能够被检测到更快。

噪音故障

JavaScript始终具有只读属性,但您在ES5之前无法自己创建对象.创建属性功能公开了该功能。如果您试图赋值对于只读属性,它将以静默方式失败。这项任务将不会更改属性的值,但您的程序将按尽管有。这是一个完整性风险,可能导致程序进入不一致的状态。在严格模式下,尝试更改只读属性将引发异常。

八角形

数字的八进制(或以8为基数)表示法极其复杂在使用word的机器上进行机器级编程时很有用大小是3的倍数。你在CDC工作时需要八进制6600大型机,其字长为60位。如果你能阅读八进制,你可以把一个单词看作20个数字。表示两位数操作码和一个数字标识了8个寄存器中的一个。从机器代码到高级语言的缓慢过渡被认为有助于在编程语言中提供八进制形式。

在C中,八度的一个极其不幸的表示是selected:前导零。所以在C中,0100是指64,而不是100,以及08是一个错误,而不是8。更不幸的是,这种不合时宜的做法复制到几乎所有现代语言中,包括JavaScript,其中它只用于创建错误。它没有其他用途。所以在严格模式下,不再允许使用八进制形式。

等等

参数伪数组变得有点多ES5中的阵列。在严格模式下,它会丢失被叫方呼叫者属性。这样可以通过论据到不受信任在不放弃大量机密上下文的情况下编写代码。此外论据函数的性质被消除了。

在严格模式下,函数文本中的重复键将生成语法错误。函数不能有两个同名参数。函数不能有与其同名的变量参数。函数不能删除它自己的变量。试图删除非可配置属性现在引发异常。基本体值没有隐式包装。


未来JavaScript版本的保留字

ECMAScript 5添加保留字列表。如果将它们用作变量或参数,strict模式将抛出错误。保留字为:

实施,接口,,包裹,私有的,受保护的,公众的,静止的、和产量


进一步阅读

1
  • 我觉得javascript现在禁止八进制相当荒谬,因为ATC应答器代码都是4位八进制,javascript规范现在正式将其标记为“它没有其他用途。”你觉得这个短语在哪里嗡嗡作响7700请求紧急降落来自?? 评论 8月3日8:36
170

我强烈建议每个开发人员现在就开始使用严格模式。有足够多的浏览器支持它,严格模式可以合法地帮助我们避免代码中出现我们甚至不知道的错误。

显然,在最初阶段,我们将遇到前所未有的错误。为了获得最大的好处,我们需要在切换到严格模式后进行适当的测试,以确保捕获了所有内容。当然,我们不只是扔使用严格并假设没有错误。因此,现在是时候开始使用这个非常有用的语言功能来编写更好的代码了。

例如,

var人={名称:'xyz',位置:'abc',全名:function(){“use strict”;return this.name;}};

JSLint公司是Douglas Crockford编写的调试器。只需粘贴到脚本中,它就会快速扫描代码中任何明显的问题和错误。

0
118

我想提供一个更有根据的答案来补充其他答案。我本想编辑最流行的答案,但失败了。我尽力使它尽可能全面和完整。

您可以参考MDN文档了解更多信息。

“使用严格”ECMAScript 5中引入的指令。

指令类似于声明,但不同。

  • 使用严格不包含关键字:该指令是一个简单的表达式语句,由一个特殊的字符串文字(单引号或双引号)组成。不实现ECMAScript 5的JavaScript引擎只看到一个没有副作用的表达式语句。预计ECMAScript标准的未来版本将引入使用作为一个真正的关键词;因此,这些引文将过时。
  • 使用严格只能在脚本或函数的开头使用,即它必须位于每个其他(实数)语句之前。它不一定是函数脚本中的第一条指令:它前面可以是由字符串文字组成的其他语句表达式(JavaScript实现可以将它们视为特定于实现的指令)。字符串文字语句是简单的表达式语句,紧跟在第一个实数语句之后(在脚本或函数中)。口译员不得将其解释为指令,且无效。

这个使用严格指令指示以下代码(在脚本或函数中)是严格代码。当脚本包含使用严格指令。当函数本身在严格代码中定义或函数包含使用严格指令。传递给评估()评估()从严格的代码调用或包含使用严格指令本身。

ECMAScript 5的严格模式是JavaScript语言的一个受限子集,它消除了该语言的相关缺陷,并具有更严格的错误检查和更高的安全性。以下列出了严格模式和正常模式之间的区别(其中前三个特别重要):

  • 您不能使用具有-严格模式下的语句。
  • 在严格模式下,必须声明所有变量:如果将值赋给尚未声明为变量、函数、函数参数、catch-clause参数或全局属性的标识符对象,然后您将获得引用错误在正常模式下,标识符隐式声明为全局变量(作为全局变量的属性对象)
  • 在严格模式下,关键字具有价值未定义在作为函数(而不是作为方法)调用的函数中。(在正常模式下总是指向全局对象). 此差异可用于测试实现是否支持严格模式:
var hasStrictMode=(function(){“use strict”;返回this===未定义}());
  • 也可以使用调用函数调用()应用在严格模式下,那么的第一个参数的值调用()应用()调用。(在正常模式下无效的未定义被全局替换对象和非对象的值被转换为对象。)

  • 在严格模式下,您将获得类型错误,当您尝试为只读属性赋值或为不可扩展对象定义新属性时。(在正常模式下,两者都会失败,但没有错误消息。)

  • 在严格模式下,将代码传递给评估(),不能在调用程序的作用域中声明或定义变量或函数(在正常模式下可以这样做)。相反,将为创建一个新范围评估()变量和函数都在这个范围内。该范围在评估()完成执行。

  • 在严格模式下,函数的arguments-object包含传递给该函数的值的静态副本。在正常模式下,arguments-object有一种“神奇”的行为:数组元素和命名函数参数引用相同的值。

  • 在严格模式下,您将获得语法错误删除运算符后面是非限定标识符(变量、函数或函数参数)。在正常模式下删除表达式将不执行任何操作,并被计算为.

  • 在严格模式下,您将获得类型错误尝试删除不可配置属性时。(在正常模式下,尝试失败删除表达式的计算结果为).

  • 在严格模式下,当您试图为一个对象文字定义几个具有相同名称的属性时,这被认为是一个语法错误。(在正常模式下没有错误。)

  • 在严格模式下,当函数声明具有多个同名参数时,将被视为语法错误。(在正常模式下没有错误。)

  • 在严格模式下,不允许使用八进制文字(这些是以开头的文字0。(在正常模式下,某些实现确实允许使用八进制文字。)

  • 在严格模式下,标识符评估论据被视为关键字。您不能更改它们的值,不能为它们赋值,也不能将它们用作catch块的变量、函数、函数参数或标识符的名称。

  • 在严格模式下,对检查调用堆栈的可能性有更多限制。论点.caller参数.被叫导致类型错误在严格模式下的函数中。此外,严格模式下函数的一些调用方和参数属性会导致类型错误当你试图阅读它们时。

1
  • 7
    “在严格模式下,不允许使用八进制文字(这些文字以0x…开头)”八进制文字以前导开头0. 评论 2016年8月11日19:52
104

我的两分钱:

严格模式的目标之一是允许更快地调试问题。它可以帮助开发人员在出现某些错误的情况时抛出异常,这些错误的情况可能会导致网页出现沉默和奇怪的行为。我们使用的那一刻使用严格,代码会抛出错误,帮助开发人员提前修复。

使用后我学到了一些重要的东西使用严格:

阻止全局变量声明:

“使用严格”;var tree1Data={name:'香蕉树',年龄:100,叶计数:100000};功能树(typeOfTree){var年龄;var叶计数;age=类型OfTree.age;leafCount=类型OfTree.leafCount;nameoftree=类型OfTree.name;};var tree1=新树(tree1Data);console.log(窗口);

现在,此代码创建树的名称在全局范围内,可以使用window.nameof树.当我们实施使用严格代码会抛出错误。

未捕获引用错误:未定义树名

消除具有声明:

具有不能使用以下工具缩小语句丑陋的js。他们也已弃用并从未来的JavaScript版本中删除。

样品:

“严格使用”;var树1数据={name:'香蕉树',年龄:100,叶数:100000};功能树(typeOfTree){var年龄;var叶计数;age=类型OfTree.age;leafCount=类型OfTree.leafCount;//nameoftree=typeOfTree.name;对于(var i=0;i<2;++i){//让(leafCount=i){/*做某事*/}}对于(var i=0;i<2;++i){使用(leafCount=i){/*做某事*/}}};var tree1=新树(tree1Data);console.log(窗口);

防止重复:

当我们有重复的属性时,它会抛出异常

Uncaught SyntaxError:对象文本中存在重复的数据属性在严格模式下允许

“使用严格”;var树1数据={name:'香蕉树',年龄:100,叶数:100000,name:‘香蕉树’};

还有一些,但我需要更多的知识。

1
79

如果您使用的是去年左右发布的浏览器,那么它很可能支持JavaScript Strict模式。只有ECMAScript 5成为当前标准之前的旧浏览器才不支持它。

命令周围的引号确保代码在较旧的浏览器中也能正常工作(尽管在严格模式下生成语法错误的东西通常只会导致脚本在较旧浏览器中以某种难以检测的方式出现故障)。

0
74

添加时“使用严格”;,以下情况将抛出语法错误在执行脚本之前:

  • 为将来的ECMAScript版本铺平道路,使用新保留的关键字之一(在预览中ECMA脚本6):实施,接口,,包裹,私有的,受保护的,公众的,静止的、和产量.

  • 以块为单位声明函数

    如果(a<b){函数f(){}}
  • 八进制语法

    变量n=023;
  • 指向全局对象。

    函数f(){“使用严格”;这.a=1;};f();
  • 在对象文本中为属性名称声明两次相同的名称

    {a:1,b:3,a:7}

    ECMAScript 6不再是这种情况(错误1041128).

  • 使用相同名称的函数声明两个函数参数

    f(a,b,b){}
  • 将值设置为未声明的变量

    函数f(x){“使用严格”;变量a=12;b=a+x*35;//错误!}f();
  • 使用删除关于变量名删除myVariable;

  • 使用评估论据作为变量或函数参数名

    “严格使用”;参数++;var obj={设置p(参数){}};尝试{}catch(参数){}函数参数(){}

资料来源:

1
  • 2
    使用ECMAScript 2015,允许再次使用重复的属性名称!请参见MDN文档. 评论 2020年1月11日17:39
71

严格模式对常规JavaScript语义进行了一些更改:

  • 通过更改来消除一些JavaScript静默错误抛出错误。

  • 修复了使JavaScript难以使用的错误引擎执行优化。

  • 禁止将来可能定义的某些语法ECMAScript的版本。

获取更多信息visit严格模式-Javascript

68

“使用严格”;是程序员不会使用JavaScript松散或不良属性的保证。它是一个向导,就像尺子会帮助你画直线一样。“使用严格”将帮助您进行“直接编码”。

那些不喜欢使用标尺直接进行代码行的人通常会在这些页面中要求其他人调试他们的代码。

相信我。与设计糟糕的代码相比,开销可以忽略不计。Doug Crockford是资深JavaScript开发人员多年,他在这里发布了一篇非常有趣的帖子就个人而言,我喜欢一直回到他的网站,以确保我不会忘记我的良好实践。

现代JavaScript实践应该总是让人联想到“严格使用”;杂注。ECMA Group将“严格”模式设置为可选的唯一原因允许经验不足的程序员访问JavaScript,并给他们时间适应新的、更安全的编码实践。

0
60

包括使用严格在所有敏感的JavaScript文件的开头,从这一点来看,这是成为一名更好的JavaScript程序员的一个小方法,可以避免随机变量变得全局化,事情会悄无声息地发生变化。

50

引用w3schools:

“严格使用”指令

JavaScript 1.8.5(ECMAScript)中新增了“use-strict”指令版本5)。

它不是一个语句,而是一个文字表达式,被前面的JavaScript版本。

“使用严格”的目的是表明代码应该以“严格模式”执行。

例如,在严格模式下,您不能使用未声明的变量。

为什么选择严格模式?

严格模式使编写“安全”JavaScript更容易。

严格模式将以前接受的“错误语法”更改为实际错误。

例如,在普通JavaScript中,错误键入变量名会创建一个新的全局变量。在严格模式下,这将引发错误,不可能意外创建全局变量。

在普通JavaScript中,开发人员不会收到任何错误反馈为不可写属性赋值。

在严格模式下,对不可写属性的任何赋值getter-only属性、不存在的属性、不存的属性变量或不存在的对象将引发错误。

请参阅http://www.w3schools.com/js/js_strict.asp了解更多

0
45

“使用严格”使JavaScript代码在其中运行严格模式,这基本上意味着在使用之前需要定义所有内容。使用strict模式的主要原因是为了避免意外全局使用未定义的方法。

同样在严格模式下,运行速度更快,一些警告或无声警告会引发致命错误,最好总是使用它来编写更整洁的代码。

“使用严格”广泛需要在ECMA5中使用,在ECMA6中,默认情况下它是JavaScript的一部分,因此如果您使用ES6,则无需添加。

看看MDN中的这些语句和示例:

“严格使用”指令
“use strict”指令在中是新的JavaScript 1.8.5(ECMAScript版本5)。这不是一个声明,而是一个文字表达式,被早期版本的JavaScript忽略。这个“使用严格”的目的是表明代码应该以“严格模式”执行。例如,在严格模式下,您不能,使用未声明的变量。

使用“use strict”的示例:
函数的严格模式:同样,要为函数,放置精确语句“使用严格”;中的(或“use strict”;)函数体位于任何其他语句之前。

1) 函数中的严格模式

函数strict(){//功能级严格模式语法'使用严格';function nested(){return“我也是!”;}return“嗨!我是一个严格模式函数!”+nested();}函数notStrict(){return“我不严格。”;}console.log(strict(),notStrict());

2) 全脚本严格模式

'使用严格';var v=“嗨!我是一个严格模式脚本!”;console.log(v);

3) 分配给不可写全局

'使用严格';//分配给不可写全局var未定义=5;//引发TypeErrorvar无限=5;//引发TypeError//不可写属性的赋值变量obj1={};Object.defineProperty(obj1,'x',{value:42,writable:false});obj1.x=9;//引发TypeError//对getter-only属性的赋值var obj2={getx(){return 17;}};对象2.x=5;//引发TypeError//分配给不可扩展对象上的新属性。var固定={};Object.proventExtensions(固定);fixed.newProp='ohai';//引发TypeError

你可以阅读有关MDN的更多信息.

0
38

ECMAScript委员会的一些成员进行了一次精彩的演讲:对JavaScript的更改,第1部分:ECMAScript 5“关于如何增量使用“使用严格”switch允许JavaScript实现者清除JavaScript的许多危险特性,而不会突然破坏世界上的每个网站。

当然,它还讨论了许多错误特性是什么,以及ECMAScript 5如何修复它们。

34

要比较的小示例:

非价格模式:

for(i of[1,2,3])console.log(i)//输出:// 1// 2// 3

严格模式:

'使用严格';for(i of[1,2,3])console.log(i)//输出://未捕获引用错误:未定义i

非价格模式:

String.prototype.test=函数(){console.log(此类型===“字符串”);};“a”.test();//输出//假

String.prototype.test=函数(){'使用严格';console.log(类型为==='string');};“a”.test();//输出//真的

0
25

请注意使用严格于引入EcmaScript 5从那时起就一直保留着。

以下是在中触发严格模式的条件欧洲标准6欧洲标准7:

  • 如果全局代码以包含使用严格指令的指令序言开头,则它是严格模式代码(参见14.1.1)。
  • 模块代码始终是严格的模式代码。
  • a的所有部分类别声明或a类表达式是严格的模式代码。
  • 如果评估代码以包含使用严格指令的指令序言开头,或者如果对评估的调用是包含在严格模式代码中的直接评估(参见12.3.4.1),则评估代码是严格模式代码。
  • 如果关联函数声明、函数表达式、生成器声明、生成器表达式、MethodDefinition或ArrowFunction包含在严格模式代码中,或者如果生成函数[[ECMAScriptCode]]内部槽值的代码以包含Use strict Directive的Directive Prologue开头。
  • 如果最后一个参数是String,而处理时该字符串是功能体以包含使用严格指令的指令序言开始。
19

开发人员应该使用“使用严格”是:

  1. 防止意外声明全局变量。使用“使用strict()”将确保使用声明变量无功功率,无功功率使用前。如:

    函数useStrictDemo(){'使用严格';//工作正常var a='没有问题';//工作不正常并抛出错误k=“问题”//即使这样也会抛出错误someObject={“问题”:“很多问题”};}
  2. 注意:“使用严格”指令只能在脚本或函数的开头识别。
  3. 字符串“参数”不能用作变量:

    “严格使用”;var参数=3.14;//这将导致错误
  4. 将限制将关键字用作变量。尝试使用它们会抛出错误。

简而言之,这将使您的代码不太容易出错,反过来也会使您编写出好的代码。

欲了解更多信息,请参阅在这里.

0
18

使用严格是一种使代码更安全的方法,因为您不能使用不按预期工作的危险功能。而且,正如前面所写的,它使代码更加严格。

15

“使用严格”;是ECMA努力使JavaScript更加健壮。它引入了JS,试图使它至少有点“严格”(自90年代以来,其他语言都实现了严格的规则)。它实际上“迫使”JavaScript开发人员遵循某种编码最佳实践。不过,JavaScript非常脆弱。没有类型化变量、类型化方法等。我强烈建议JavaScript开发人员学习一种更健壮的语言,如Java或ActionScript3,并在JavaScript代码中实现相同的最佳实践,这样会更好地工作,更容易调试。

15

ECMAScript 5中引入了JavaScript“strict”模式。

(函数(){“使用严格”;你的代码。。。})();

写作“使用严格”;在JS文件的最顶部,会打开strict语法检查。它为我们完成以下任务:

  1. 如果尝试赋值给未声明的变量,则显示错误

  2. 阻止您覆盖关键JS系统库

  3. 禁止一些不安全或容易出错的语言功能

使用严格也可以在单个函数内部工作。包括以下内容总是更好的做法使用严格在代码中。

浏览器兼容性问题:“use”指令意味着向后兼容。不支持它们的浏览器只会看到没有进一步引用的字符串文本。所以,他们会忽略它,继续前进。

14

Use Strict用于显示常见和重复的错误,以便以不同的方式处理,并更改java脚本的运行方式,这些更改包括:

  • 防止意外全局错误

  • 无多重记录

  • 使用消除

  • 消除了这种强制

  • 更安全的评估()

  • 不可变项的错误

你也可以读这个文章有关详细信息

14

通常,JavaScript不遵循严格的规则,因此增加了出错的可能性。使用后“使用严格”,JavaScript代码应该遵循其他编程语言中的严格规则集,如终止符的使用、初始化前的声明等。

如果“使用严格”如果使用,则应按照一组严格的规则编写代码,从而减少错误和歧义的可能性。

0
10

“使用严格”;定义应在中执行JavaScript代码“严格模式”。

  • ECMAScript版本5中新增了“use-strict”指令。
  • 它不是一个语句,而是一个文字表达式,被前面的JavaScript版本。
  • “使用严格”的目的是表明代码应该以“严格模式”执行。
  • 例如,在严格模式下,您不能使用未声明的变量。

所有现代浏览器都支持“严格使用”,除了Internet Explorer 9及更低版本.

劣势

如果开发人员使用的库是严格模式,但开发人员习惯于在正常模式下工作,那么他们可能会对库调用一些无法正常工作的操作。

更糟糕的是,由于开发人员处于正常模式,他们没有抛出额外错误的优势,因此错误可能会自动失败。

此外,如上所列,严格模式会阻止您执行某些操作。

人们通常认为首先不应该使用这些东西,但一些开发人员不喜欢这种约束,希望使用该语言的所有功能。

8

由于浏览器大战和管理不善,JavaScript的设计和实现过于仓促。因此,许多糟糕的设计决策、非直观的语法和令人困惑的语义都进入了语言。严格模式旨在纠正其中一些错误。

但是,在不创建替代解释的情况下修复这些错误会破坏向后兼容性。所以,“使用严格”指令在与程序员通信时创建代码的替代解释。

例如,关键字是指方法定义中的对象,如自己其他语言。

设o={name:'无名氏',sayName:函数(){console.log(this.name);}};o.sayName();//'约翰·多伊

在方法上下文之外没有任何用途,但所有JavaScript函数都有关键字(无论是否为方法):

函数run(){console.log(this);}run();//窗口

在这里解析为全局对象,因为全局对象在作用域中已经可用,所以该对象没有意义,也没有用途。

在严格模式下在全局函数中,解析为undefined,这正是我们所期望的。

“使用严格”函数run(){console.log(this);}run();//未定义

有些错误即使在严格模式下也无法修复,因为语法应该对较旧的浏览器有效,因为它们会忽略“严格模式”指令。这是精心设计的。

7

严格模式可以防止内存泄漏。

请检查以非限制模式编写的以下功能:

函数getname(){name=“堆栈溢出”;//不使用var关键字返回名称;}获取名称();console.log(名称);//堆栈溢出

在这个函数中,我们使用了一个名为名称函数内部。在内部,编译器将首先检查在该特定函数范围内是否有使用该特定名称声明的变量。由于编译器知道没有这样的变量,所以它将检查外部范围。在我们的案例中,这是全球范围。同样,编译器知道全局空间中也没有使用该名称声明的变量,因此它在全局空间中为我们创建了这样一个变量。从概念上讲,该变量将在全局范围内创建,并在整个应用程序中可用。

另一种情况是,例如,变量在子函数中声明。在这种情况下,编译器会检查该变量在外部范围(即父函数)中的有效性。只有这样,它才会检查全局空间,并在那里为我们创建一个变量。这意味着需要进行额外的检查。这将影响应用程序的性能。


现在让我们以严格模式编写相同的函数。

“使用严格”函数getname(){name=“堆栈溢出”;//不使用var关键字返回名称;}获取名称();console.log(名称);

我们将得到以下错误。

未捕获引用错误:未定义名称在getname(<匿名>:3:15)<匿名>:6:5

这里,编译器抛出引用错误。在严格模式下,编译器不允许我们在未声明变量的情况下使用该变量。因此可以防止内存泄漏。此外,我们可以编写更优化的代码。

7

严格模式消除了在非严格模式下会被忽略的错误,从而使javascript“更加安全”。

它是否被视为最佳实践之一?

是的,它被认为是使用javascript时最佳实践的一部分,包括严格模式。这是通过在JS文件中添加以下代码行来完成的。

'使用严格';

在代码中。

这对用户代理意味着什么?

指示代码应以严格模式进行解释向浏览器等用户代理指定,他们应将代码视为已编写的代码,如果代码没有意义,则抛出错误。

例如:在您的.js文件文件中包含以下代码:

场景1:[无严格模式]

var city=“芝加哥”console.log(city)//打印城市名称,即芝加哥

场景2:[无严格模式]

city=“芝加哥”console.log(city)//打印城市名称,即芝加哥

那么,为什么在这两种情况下都要打印变量名呢?

如果没有启用严格模式,用户代理通常会对有问题的代码进行一系列修改,以使其有意义。表面上看,这似乎是一件好事,实际上,在严格模式之外工作可以让人们在不完全确定所有细节的情况下了解JavaScript代码。然而,作为一名开发人员,我不想在我的代码中留下错误,因为我知道它可能会回来咬我以后,我也只想写好代码。这就是严格模式的作用。

场景3:[严格模式]

'使用严格';city=“芝加哥”console.log(city)//引用错误:asignment是未声明的变量city。

其他提示:为了使用strict模式维护代码质量,您不需要反复编写,尤其是当您有多个.js文件文件。您可以在中全局实施此规则埃斯林规则如下:

文件名: .eslintrc.js文件

模块导出={环境:{es6:正确},规则:{strict:['error','global'],},};

好吧,那么在严格模式下可以防止什么呢?

  • 使用变量而不声明它将在严格模式下抛出错误。这是为了防止在整个应用程序中无意中创建全局变量。打印Chicago的示例特别涵盖了这一点。

  • 删除变量、函数或参数在严格模式下为no-no。

    “使用严格”;函数x(p1,p2){};删除x;//这将导致错误
  • 复制参数名称在严格模式下允许。

    “使用严格”;函数x(p1,p1){};//这将导致错误
  • 不允许使用Javascript语言中的保留字在严格模式下。单词是implements interface、let、packages、private、protected、public。静态和屈服

有关更全面的列表,请查看此处的MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode开发人员

4

strict模式支持v8引擎中的严格功能。一些功能的简短示例:

您可以通过编写以下内容来全局启用它:

'严格使用';//已启用严格模式!

每个函数都包含在函数中:

让myfunc=()=>{'使用严格';//已启用严格模式b=0;//打破了}
  • 使用变量之前必须声明它(sane-imo):
变量x;x=“0”;//好 啊y=“”;//不正常
  • 启用了es6功能(这取决于浏览器),对于节点v4+,这一点很重要。

  • 在某些情况下,性能更好。

还有更多功能,请检查在这里更多信息!

不是你想要的答案吗?浏览已标记的其他问题问你自己的问题.