提问



最近,我通过Crockford的JSLint运行了一些我的JavaScript代码,它给出了以下错误:[181]



  第1行问题1:缺少使用严格声明。



做一些搜索,我意识到有些人将"use strict";添加到他们的JavaScript代码中。一旦我添加了语句,错误就会停止显示。不幸的是,谷歌没有透露这个字符串声明背后的历史。当然它必须与浏览器如何解释JavaScript有关,但我不知道效果会是什么。


那么"use strict";到底是什么,它意味着什么,它是否仍然相关?


当前任何浏览器是否响应"use strict";字符串或将来是否使用?

最佳参考


这篇关于Javascript Strict Mode的文章可能会让你感兴趣:John Resig - ECMAScript 5 Strict Mode,JSON等[182]


引用一些有趣的部分:



  严格模式是ECMAScript 5中的一项新功能,允许您在严格操作上下文中放置程序或函数。这种严格的上下文可以防止某些操作被采取并引发更多异常。



和:



  严格模式有两种方式:

  
  

      
  • 它捕获了一些常见的编码器,抛出异常。

  •   
  • 当采取相对不安全的操作(例如获取对全局对象的访问权限)时,它会阻止或抛出错误。

  •   
  • 它会禁用令人困惑或思索不佳的功能。

  •   



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



// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code... 



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


所以,我认为它有点像你可以在Perl 中使用"use strict"(因此名称?):通过检测更多可能导致破坏的事情,它可以帮助您减少错误。


目前,所有主流浏览器都支持 (IE 9及以下版本)。[183]​​]]

其它参考1


这是ECMAScript 5的一个新功能.John Resig写了一个很好的摘要。[184]


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


"use strict";


现在把它放在你的代码中不应该导致当前浏览器出现任何问题,因为它只是一个字符串。如果您的代码违反了编译指示,将来可能会导致您的代码出现问题。例如,如果您当前foo = "bar"没有先定义foo,那么您的代码将开始失败......在我看来这是一件好事。

其它参考2


语句"use strict";指示浏览器使用Strict模式,这是一种简化且更安全的JavaScript功能集。


功能列表(非详尽无遗)




  1. 禁止全局变量。 (在变量名中删除var声明和拼写错误)

  2. 无效的失败分配将在严格模式下抛出错误(分配NaN = 5;)

  3. 尝试删除不可删除的属性将抛出(delete Object.prototype)

  4. 要求对象文字中的所有属性名称都是唯一的(var x = {x1: "1", x1: "2"})

  5. 功能参数名称必须唯一(function sum (x, x) {...})

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

  7. 禁止with关键字

  8. eval在严格模式下不会引入新变量

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

  10. 禁止以任何形式绑定或分配名称evalarguments

  11. 严格模式不会使用形式参数别名arguments对象的属性。 (即在function sum (a,b) { return arguments[0] + b;}中这是有效的,因为arguments[0]被绑定到a,依此类推。)

  12. arguments.callee不受支持



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

其它参考3


如果人们担心使用use strict,可能值得查看这篇文章:


ECMAScript 5在浏览器中支持严格模式。这是什么意思?

   NovoGeek.com - 克里希纳的博客 [186]


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


function isStrictMode(){
    return !this;
} 
/*
   returns false, since 'this' refers to global object and 
   '!this' becomes false
*/

function isStrictMode(){   
    "use strict";
    return !this;
} 
/* 
   returns true, since in strict mode the keyword 'this'
   does not refer to global object, unlike traditional JS. 
   So here, 'this' is 'undefined' and '!this' becomes true.
*/

其它参考4


需要注意的是,所有的硬件程序员:将"use strict"应用于现有代码可能是危险的!这个东西不是一些感觉良好,快乐的贴纸,你可以拍打代码,使其更好。使用"use strict"编译指示,浏览器会在以前从未扔过的随机位置突然出现异常只是因为在那个位置你正在做一些默认/松散的JavaScript快乐允许的东西,但是严格的JavaScript憎恶!你可能有严格的违规行为隐藏在代码中很少使用的调用中,这些调用只会在最终运行时抛出异常 - 例如,在付费客户使用的生产环境中!


如果您想要采取措施,最好应用"use strict"以及全面的单元测试和严格配置的JSHint构建任务,这将使您确信模块中没有黑暗的角落会吹可怕的只是因为你已经打开严格模式。或者,嘿,这是另一种选择:只是不要"use strict"添加到你的任何遗留代码中,它可能更安全,老实说。 绝对不要"use strict"添加到您不拥有或维护的任何模块,例如第三方模块。


我认为尽管它是一种致命的笼养动物,"use strict"可能是好东西,但你必须做得对。严格要求的最佳时机是您的项目是绿地并且您从头开始。配置JSHint/JSLint时所有的警告和选项都会随着团队的紧张而变得紧张,得到一个良好的构建/测试/断言系统,如Grunt+Karma+Chai那样,并且只有那么开始标记所有新模块如"use strict"。准备好治愈许多琐碎的错误和警告。如果JSHint/JSLint产生任何违规,请确保每个人都了解重力,将构建配置为FAIL。


当我采用"use strict"时,我的项目不是一个绿地项目。结果,我的IDE充满了红色标记,因为我没有"use strict"我的模块的一半,而JSHint抱怨这一点。这提醒我,我将来应该做什么重构。我的目标是由于我所有遗失的"use strict"陈述而成为红色标记,但现在还需要几年的时间。

其它参考5


使用'use strict';不会突然使您的代码更好。



JavaScript严格模式是ECMAScript 5中的一项功能。您可以通过在脚本/函数的顶部声明这一点来启用严格模式。[187] [188]


'use strict';


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


考虑这个例子:


var a = 365;
var b = 030;


在他们对数字文字排列的痴迷中,开发人员无意中用八进制文字初始化变量b。非严格模式将此解释为具有值24的数字文字(在基数10中)。但是,严格模式会抛出错误。


有关严格模式的非专业清单,请参阅此答案。





我应该在哪里使用'use strict';?




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

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






如何使用严格模式?




  1. 在脚本之上插入'use strict';语句:


    // File: myscript.js
    
    'use strict';
    var a = 2;
    ....
    


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

  2. 或者,在函数体上插入'use strict';语句:


    function doSomething() {
        'use strict';
        ...
    }
    


    函数doSomething的词法范围中的所有内容都将以严格模式解释。 词汇范围这个词在这里很重要。请参阅此答案以获得更好的解释。






在严格模式下禁止哪些事情?



我发现了一篇很好的文章,描述了严格模式中禁止的几件事(请注意,这不是一个独家清单):[191]



  

范围


  
  从历史上看,JavaScript一直在混淆功能如何
  是范围的。有时他们似乎是静态范围的,但有些
  功能使它们的行为类似于动态范围。这是
  令人困惑,使程序难以阅读和理解。
  误解会导致错误。这也是性能问题。
  静态作用域允许在编译时发生变量绑定
  时间,但动态范围的要求意味着绑定必须
  延迟到运行时,它具有显着的性能
  罚款。

  
  严格模式要求所有变量绑定都是静态完成的。
  这意味着以前需要动态绑定的功能
  必须被淘汰或修改。具体来说,with语句是
  淘汰,以及评估功能的篡改能力
  其来电者的环境受到严格限制。

  
  严格代码的一个好处是像YUI Compressor这样的工具
  在处理它时可以做得更好。[192]

  
  

隐含的全局变量


  
  JavaScript隐含了全局变量。如果
  你没有显式声明一个变量,一个全局变量是
  隐含地为你宣布。这使编程更容易
  初学者,因为他们可以忽略一些基本的家务
  家务。但它使更大程序的管理更多
  困难,它显着降低了可靠性。严格来说
  模式,不再创建隐含的全局变量。你应该
  明确声明所有变量。

  
  

全球泄漏


  
  有许多情况可能导致this
  绑定到全局对象。例如,如果你忘了
  在调用构造函数时提供new前缀,
  构造函数this将意外绑定到全局对象,所以
  而不是初始化一个新对象,它将是静默的
  篡改全局变量。在这些情况下,严格模式会
  而是将this绑定到undefined,这将导致构造函数
  抛出异常,允许检测错误
  更早。

  
  

嘈杂失败


  
  JavaScript一直都有只读属性,但是你
  在ES5 Object.createProperty之前不能自己创造它们
  功能暴露了这种能力。如果您尝试分配值
  对于只读属性,它将无声地失败。任务将
  不更改属性的值,但您的程序将继续执行
  虽然它有。这是一种可导致程序的完整性危害
  进入一个不一致的状态。在严格模式下,尝试更改
  只读属性将抛出异常。

  
  

八路


  
  数字的八进制(或基数8)表示极其重要
  在使用word的机器上进行机器级编程时很有用
  大小是3的倍数。在使用CDC时,您需要八进制
  6600主机,字长为60位。如果你能读懂
  八进制,你可以看一个单词为20位数。代表两位数
  操作码,一位数字识别出8个寄存器中的一个。在此期间
  从机器代码到高级语言的缓慢过渡,确实如此
  被认为在编程语言中提供八进制形式很有用。

  
  在C中,一个非常不幸的八进制表示是
  选中:领先零。所以在C中,0100表示64,而不是100,08表示
  错误,而不是8.更不幸的是,这种时代错误已经存在
  复制到几乎所有现代语言,包括JavaScript,在哪里
  它仅用于创建错误。它没有其他目的。所以
  严格模式,不再允许八进制形式。

  
  

等等


  
  参数伪数组变得多一点
  ES5中的数组类似。在严格模式下,它失去了calleecaller
  属性。这样就可以将arguments传递给不受信任的人
  代码没有放弃很多保密的背景。而且,
  arguments功能的属性被消除。

  
  在严格模式下,函数文字中的重复键将产生一个
  语法错误。函数不能有两个具有相同名称的参数。
  函数不能具有与其中一个名称相同的变量
  参数。函数不能delete自己的变量。试图
  delete不可配置的属性现在抛出异常。原始
  值不是隐式包装的。






未来JavaScript版本的保留字



ECMAScript 5添加了一个保留字列表。如果将它们用作变量或参数,则严格模式将引发错误。保留字是:



  implementsinterfaceletpackageprivateprotectedpublicstatic和[[yield






进一步阅读




  • 严格模式 - JavaScript | MDN

  • 严格模式的浏览器支持

  • 过渡到严格模式


其它参考6


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


显然,在初始阶段,我们以前从未遇到过错误。为了获得全部好处,我们需要在切换到严格模式后进行适当的测试,以确保我们已经捕获了所有内容。当然,我们不只是在代码中抛出use strict并假设没有错误。所以,流失是时候开始使用这个非常有用的语言功能来编写更好的代码。


例如,


var person = {
    name : 'xyz',
    position : 'abc',
    fullname : function () {  "use strict"; return this.name; }
};


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

其它参考7


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


您可以参考MDN文档以获取更多信息。[197]


"use strict" ECMAScript 5中引入的指令。


指令与陈述类似,但不同。



  • use strict不包含关键词:该指令是一个简单的表达式语句,它由一个特殊的字符串文字(单引号或双引号)组成。没有实现ECMAScript 5的JavaScript引擎只能看到没有副作用的表达式语句。预计ECMAScript标准的未来版本将use作为真正的关键词引入;因此报价将过时。

  • use strict只能在脚本或函数的开头使用,即它必须在每个其他(真实)语句之前。它不必是函数脚本中的第一条指令:它可以在其他由字符串文字组成的语句表达式之前(并且JavaScript实现可以将它们视为特定于实现的指令)。字符串文字语句遵循第一个真实语句(在脚本或函数中)是简单的表达式语句。口译员不得将其解释为指令而且不起作用。



use strict指令表明以下代码(在脚本或函数中)是严格的代码。
当脚本包含use strict指令时,脚本最高级别的代码(不在函数中的代码)被视为严格代码。
当函数本身在严格代码中定义或函数包含use strict指令时,函数的内容被视为严格代码。
当从[[严格代码]]调用eval()或包含use strict指令本身时,传递给eval()方法的代码被视为严格代码。


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



  • 您不能在严格模式下使用with - 语句。

  • 在严格模式下,必须声明所有变量:如果为尚未声明为变量的标识符,函数,函数参数,catch-clause参数或全局Object的属性赋值,则你会得到ReferenceError。在正常模式下,标识符被隐式声明为全局变量(作为全局Object的属性)

  • 在严格模式下,关键字this在作为函数(而不是方法)调用的函数中具有值undefined。 (在正常模式下this始终指向全局Object)。这种差异可用于测试实现是否支持严格模式:




var hasStrictMode = (function() { "use strict"; return this===undefined }());




  • 当在严格模式下使用call()apply调用函数时,this正是call()apply()的第一个参数的值。]]调用。 (在正常模式下nullundefined被全局Object替换,而非对象的值将被转换为对象。)

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

  • 在严格模式下,当将代码传递给eval()时,您无法在调用者的范围内声明或定义变量或函数(正如您在普通模式下所做的那样)。而是为eval()创建一个新范围,变量和函数在该范围内。 eval()完成执行后,该范围被销毁。

  • 在严格模式下,函数的arguments-object包含值的静态副本,这些副本将传递给该函数。在正常模式下,arguments-object有一些魔法行为:数​​组元素和命名函数参数都引用相同的值。

  • 在严格模式下,当delete运算符后跟非限定标识符(变量,函数或函数参数)时,您将得到SyntaxError。在正常模式下,delete表达式什么都不做,并且被评估为false

  • 在严格模式下,当您尝试删除不可配置的属性时,您将获得TypeError。 (在正常模式下,尝试只是失败,delete表达式被评估为false)。

  • 在严格模式下,当您尝试为对象文字定义多个具有相同名称的属性时,会将其视为语法错误。 (在正常模式下没有错误。)

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

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

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

  • 在严格模式下,对检查调用堆栈的可能性有更多限制。 arguments.callerarguments.callee在严格模式下导致函数TypeError。此外,一些来电者和辩论者当您尝试读取函数时,严格模式下的函数属性会导致TypeError


其它参考8


我的两分钱:


严格模式的目标之一是允许更快地调试问题。它可以帮助开发人员在发生某些可能导致静默的错误事件时抛出异常。你网页的奇怪行为。在我们使用use strict的那一刻,代码将抛出错误,这有助于开发人员提前修复它。


使用use strict后我学到的很少重要的事情:


阻止全局变量声明:


var tree1Data = { name: 'Banana Tree',age: 100,leafCount: 100000};

function Tree(typeOfTree) {
    var age;
    var leafCount;

    age = typeOfTree.age;
    leafCount = typeOfTree.leafCount;
    nameoftree = typeOfTree.name;
};

var tree1 = new Tree(tree1Data);
console.log(window);


现在,此代码在全局范围内创建nameoftree,可以使用window.nameoftree访问。当我们实现use strict时,代码会抛出错误。



  未捕获的ReferenceError:未定义nameoftree



示例 [198]


消除with声明:


with语句不能使用像uglify-js这样的工具来缩小。它们也被弃用并从未来的JavaScript版本中删除。[199] [200]


示例 [201]


防止重复:


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



  未捕获的SyntaxError:对象文字中的重复数据属性不是
  在严格模式下允许



"use strict";
var tree1Data = {
    name: 'Banana Tree',
    age: 100,
    leafCount: 100000,
    name:'Banana Tree'
};


还有更多,但我需要获得更多的知识。

其它参考9


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


命令周围的引号确保代码仍然可以在旧版浏览器中工作(尽管在严格模式下生成语法错误的事情通常只会导致脚本在这些旧版浏览器中以某种难以检测的方式出现故障)。

其它参考10


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



  • 通过更改它们来消除一些JavaScript无提示错误
    抛出错误。

  • 修复了使JavaScript难以解决的错误
    引擎进行优化。

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



了解更多信息vistit Strict Mode- Javascript [202]

其它参考11


使用严格;是程序员不会使用JavaScript的松散或不良属性的保险。这是一个指南,就像一个统治者将帮助你做直线。 使用严格将帮助您进行直接编码。


那些不喜欢使用标尺来直线行的人通常会在那些要求其他人调试代码的页面中结束。


相信我。与设计不良的代码相比,开销可以忽略不计。多年来一直担任高级JavaScript开发人员的Doug Crockford在这里发表了一篇非常有趣的帖子。就个人而言,我喜欢一直回到他的网站,以确保我不会忘记我的良好做法。[203]


现代JavaScript实践应该始终唤起使用严格; pragma。 ECMA集团将严格模式设为可选的唯一原因是允许经验较少的编码人员访问JavaScript,并给予时间适应新的更安全的编码实践。

其它参考12


添加"use strict";时,以下情况将在脚本执行之前抛出 SyntaxError :



  • 为未来的ECMAScript版本铺平道路,使用一个新保留的关键字(预先设置 ECMAScript 6 ):implementsinterface]],letpackageprivateprotectedpublicstaticyield

  • 在块中声明功能


    if(a<b){ function f(){} }
    

  • 八进制语法


    var n = 023;
    

  • this指向全局对象。


     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
    

  • 为对象文字中的属性名称声明两次相同的名称


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


    在ECMAScript 6中不再是这种情况(错误1041128)。[204]

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


    f(a, b, b){}
    

  • 将值设置为未声明的变量


    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    

  • 在变量名称delete myVariable;上使用delete

  • 使用evalarguments作为变量或函数参数名称


    "use strict";
    arguments++;
    var obj = { set p(arguments) { } };
    try { } catch (arguments) { }
    function arguments() { } 
    



资料来源:



  • 在MDN上转换为严格模式[205]

  • MDN上的严格模式[206]

  • JavaScript的严格模式以及为什么要在Colin J. Ihrig的博客(存档版本)[207]上使用它


其它参考13


从这一点开始,将use strict包含在所有敏感JavaScript文件的开头是一个很好的方法,可以成为一个更好的JavaScript程序员,避免随机变量变为全局变量,并且事情会发生变化。

其它参考14


使用严格指令



use strict指令是JavaScript 1.8.5(ECMAScript版本5)中的新指令。


它不是一个语句,而是一个文字表达式,被早期版本的JavaScript忽略。


use strict的目的是表明代码应该以严格模式执行。


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


为何选择严格模式?



严格模式可以更轻松地编写安全JavaScript。


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


例如,在普通的JavaScript中,错误输入变量名称会创建一个新的全局变量。在严格模式下,这将引发错误,从而无法意外创建全局变量。


在普通的JavaScript中,开发人员不会收到任何错误反馈,将值分配给不可写属性。


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


请参阅...



  http://www.w3schools.com/js/js_strict.asp[208]



...了解更多

其它参考15


有一些人参加了ECMAScript委员会:JavaScript的变化,第1部分:ECMAScript 5,关于"use strict"交换机的增量使用如何允许JavaScript实施者清理许多危险的功能JavaScript没有突然破坏世界上的每个网站。[209]


当然,它还讨论了很多这些错误的内容以及ECMAScript 5如何修复它们。

其它参考16


use strict使JavaScript代码在strict mode中运行,这基本上意味着在使用它们之前需要定义所有内容,strict mode的主要原因是避免任何undefined的意外全局使用方法。


在严格模式下,事情运行得更快,一些警告或静音警告,抛出致命错误,最好总是使用它来制作更整洁的代码。


use strict广泛需要在ECMA5中使用,在ECMA6中它默认是javascript的一部分,所以如果你使用ES6则不需要添加。


查看来自MDN的这些陈述和示例:



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

  
  使用严格使用的例子:

  功能的严格模式:同样,为a调用严格模式
  功能,把确切的声明使用严格; (或使用严格;)in
  任何其他陈述之前的功能体。



1)功能严格模式


 function strict() {
      // Function-level strict mode syntax
      'use strict';
      function nested() { return 'And so am I!'; }
      return "Hi!  I'm a strict mode function!  " + nested();
    }
    function notStrict() { return "I'm not strict."; }

    console.log(strict(), notStrict());


2)全脚本严格模式


'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);


3)分配给不可写的全局


'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError


欲了解更多信息,请访问此页面[210]

其它参考17


请注意,use strict是在EcmaScript 5中引入的,并且从那时开始保存。[211]


以下是在ES6和ES7中触发严格模式的条件:[212] [213]



  

      
  • 全局代码是严格模式代码,如果它以包含使用严格指令的指令序言开头(见14.1.1)。

  •   
  • 模块代码始终是严格的模式代码。

  •   
  • ClassDeclaration 或 ClassExpression 的所有部分都是严格模式代码。

  •   
  • 如果Eval代码以包含Use Strict Directive的Directive Prologue开头,或者对eval的调用是严格模式代码中包含的直接eval(见12.3.4.1),则Eval代码是严格模式代码。

  •   
  • 如果关联的 FunctionDeclaration,FunctionExpression,GeneratorDeclaration,GeneratorExpression,MethodDefinition或ArrowFunction 包含在严格模式代码中,或者产生函数值[[]]的代码,则函数代码是严格模式代码。 ECMAScriptCode]]内部插槽以包含使用严格指令的指令序言开头。

  •   
  • 作为内置函数和生成器构造函数的参数提供的函数代码是严格模式代码,如果最后一个参数是一个String,处理时是一个以指令序言开头的 FunctionBody 包含使用严格指令。

  •   


其它参考18


use strict是一种使代码更安全的方法,因为你不能使用危险的功能,这些功能可能不像你期望的那样工作。并且在它使代码更严格之前就被写了。

其它参考19


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

其它参考20


比较小例子:


非严格模式:


for (i of [1,2,3]) console.log(i)

// output:
// 1
// 2
// 3


严格模式:


'use strict';
for (i of [1,2,3]) console.log(i)

// output:
// Uncaught ReferenceError: i is not defined

其它参考21


开发人员应该使用"use strict"的主要原因是:



  1. 防止意外声明全局变量。使用"use strict()"将确保在使用前使用var声明变量。
    例如:


    function useStrictDemo(){
     'use strict';
     //works fine
     var a = 'No Problem';
    
     //does not work fine and throws error
     k = "problem"
    
     //even this will throw error
     someObject = {'problem': 'lot of problem'};
    }
    

  2. N.B:"use strict"指令仅在脚本或函数的开头被识别。

  3. 字符串"arguments"不能用作变量:


    "use strict";
    var arguments = 3.14;    // This will cause an error
    

  4. 会将关键字的使用限制为变量。试图使用它们会引发错误。



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


要了解更多信息,请参阅此处。[214]

其它参考22


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



  • 防止偶然的全局变量

  • 没有重复

  • 消除

  • 消除这种胁迫

  • 更安全的评估()

  • 不可变的错误



你也可以阅读这篇文章了解详情[215]

其它参考23


通常,java脚本不遵循严格的规则,因此增加了错误的可能性。在使用"use strict"之后,java脚本代码应该遵循严格的规则集,就像在其他编程语言中一样,例如使用终结符,初始化之前的声明等。


如果使用"use strict"则应遵循严格的规则集编写代码,从而减少错误和模糊的可能性。

其它参考24


在ECMAScript 5中引入了JavaScript严格模式。


  (function() {
  "use strict";
   your code...
   })();


写使用严格;在JS文件的最顶层打开严格
语法检查。它为我们完成以下任务:


(i)如果您尝试分配未声明的变量,则会显示错误


(ii)阻止您覆盖关键的JS系统库


(ii)禁止一些不安全或容易出错的语言功能


use strict也适用于个别功能。在代码中包含严格使用总是更好的做法。


浏览器兼容问题:
use指令旨在向后兼容。不支持它们的浏览器只会看到一个没有被进一步引用的字符串文字。所以,它们会越过它继续前进。

其它参考25


只是想补充一点。


使用严格模式的原因--->



  • 严格模式可以更轻松地编写安全JavaScript。

  • 严格模式将先前接受的错误语法更改为真实

    错误。

  • 例如,在普通的JavaScript中,错误输入变量名称

    创建一个新的全局变量。

  • 在严格模式下,这会引发错误,使其无法进行
    意外地创建一个全局变量。

  • 在严格模式下,对不可写属性的任何赋值,

    getter-only属性,不存在的属性,不存在的

    变量或不存在的对象将引发错误。



在严格模式下会抛出错误的东西
不允许使用变量而不声明它:


"use strict";
 x = 3.14;                // This will cause an error


对象也是变量。


不允许使用对象而不声明它:


  "use strict";
  x = {p1:10, p2:20};      // This will cause an error


不允许删除变量(或对象)。


  "use strict";
   var x = 3.14;
   delete x;                // This will cause an error


出于安全原因,不允许eval()在调用它的范围内创建变量:


"use strict";
 eval ("var x = 2");
 alert (x);               // This will cause an error


在像f()这样的函数调用中,this值是全局对象。在严格模式下,它现在是未定义的。


use strict仅在脚本开头才能识别。