最近,我通过克罗福德 查了一些JavaScript代码JSLint JSLint,并给出了以下错误:

第1行第1字符1:缺少“严格使用”声明的问题。

在做一些搜索时,我意识到有些人加了"use strict";输入 JavaScript 代码。 一旦我添加了该语句, 错误就不再出现。 不幸的是, Google 并未披露此字符串语句背后的大部分历史。 当然, 它肯定与浏览器如何解读 JavaScript 有关, 但我不知道效果会是什么 。

那么,什么是"use strict";关于它的意义是什么,它是否仍然相关?

当前浏览器中的任意浏览器响应"use strict";字符串, 还是用于未来用途 ?


当前回答

严格使用用于显示常见和重复错误, 以便以不同的方式处理, 并改变 Java 脚本的运行方式,

  • 预防意外全球事故

  • 无重复

  • 消除用

  • 消除这种胁迫

  • 更安全电子( )

  • 不可更改的错误

您也可以阅读此文件第1条详细信息

其他回答

在ECMAScript委员会里 有一些人说得很好:对 JavaScript, 第一部分 1: ECMAScript 5 的修改”关于逐步增加使用《公约》和《京都议定书》"use strict"允许 JavaScript 执行者清理 JavaScript 的许多危险特性,

当然,它也谈到很多这些错误的特征是什么,以及ECMAScript 5是如何修补这些错误的。

我想提出一个更有根据的答案来补充其他答案。 我希望编辑最受欢迎的答案,但失败了。 我试图尽可能全面和完整地完成它。

您可以引用MDN 文件供参考。

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

指令与声明相似,但不同。

  • use strict关键词不包含关键词:指令是一个简单的表达式声明,由特殊的字符串字典(单引或双引号)组成。 JavaScript 引擎,不执行ECMAScript 5, 只需看到表达式声明而无副作用。预计未来版本的ECMAScript 标准会引入。use作为真正的关键词;引号将因此过时。
  • use strict只能在脚本或函数的开头使用, 即它必须先于所有其他( 真实的) 语句。 它不必是函数脚本的第一个指令 : 它可以在它之前加上由字符串字典组成的其他语句表达式( JavaScript 执行可以视为执行特定指令 ) 。 字符串语句( 脚本或函数中) 后面的第一个真实语句是简单的表达式语句。 口译员不能把它们解释为指令, 它们没有效果 。

缩略use strict指令指示表示以下代码(在脚本或函数中)是严格的代码。当脚本包含use strict指令。当函数本身在严格代码中定义函数本身时,或当函数包含use strict指令。eval()当下列情况中,当eval()被严格法典或包含use strict指令本身。

ECMAScript 5的严格模式是JavaScript语言的一个限制性子集,它消除了有关语言的缺陷,并具有更严格的错误检查和安全性。

  • 您不能使用with- 严格声明
  • 在严格模式下,所有变量都必须声明:如果给尚未被宣布为变量、功能、功能参数、抓抓圈参数或全球属性的标识符指定值,则必须声明所有变量。Object,然后你会得到ReferenceError。在正常模式中,标识符被隐含地宣布为全球变量(作为全球属性的属性)Object)
  • 在严格模式中关键字thisundefined在函数中被援引为函数的函数(不是方法)。 (以正常模式)this总是指向全球Object这种差异可用于测试执行是否支持严格的模式:
var hasStrictMode = (function() { "use strict"; return this===undefined }());
  • 同样,在援引一项职能时,call()apply严格的方式,然后this正好是call()apply()引用。 (以正常模式)nullundefined被全局替换为全局Object非对象的数值被投入对象。 )

  • 严格的方式,你会得到TypeError,当您试图为非扩展对象指定只读属性或定义新属性时。(在正常模式中,两个都只是没有错误消息的失败。)

  • 严格的方式,当通过代码到eval()中,您无法在调用者的范围内声明或定义变量或函数(您可以在正常模式下这样做)。相反,为eval()以及变量和函数属于这一范围。eval()完成执行。

  • 在严格模式下,函数的参数对象包含一个数值的静态副本,这些数值被传递到该函数。在正常模式下,参数对象具有某种“磁性”行为:数组的元素和命名的函数参数同时引用相同的值。

  • 严格的方式,你会得到SyntaxError时当delete运算符后面有一个不合格的标识符(变量、函数或函数参数)。在正常模式中delete表达式不会做任何事情,并且被评价为false.

  • 严格的方式,你会得到TypeError当您试图删除一个不可配置的属性时。 (在正常模式中,尝试失败和delete表达式被评价为false).

  • 在严格模式下,当您试图用相同名称来定义一个对象字面上的多个属性时,它就被视为一种同义错误。 (在正常模式下,没有错误。 )

  • 在严格模式下,当函数声明含有相同名称的多个参数时,该函数声明被视为一种同义错误。 (在正常模式下,没有错误。 )

  • 在严格模式下,不允许使用八字字词(这些是开头的字词)0。(在正常模式中,有些执行允许八字行。)

  • 在严格的模式下,标识符evalarguments被处理为关键字。您不能改变它们的值,不能给它们指定一个值,也不能用它们来命名一个抓取区块的变量、函数、函数参数或识别符号。

  • 严格地说,检查电话亭的可能性受到更多的限制。arguments.callerarguments.callee原因 a/TypeError此外,在严格模式下,某些调用人和参数的函数属性导致TypeError当你试着读的时候

如果人们担心使用use strict也许值得看看这篇文章:

在浏览器中支持 ECMAScript 5 “ 立体模式” 。 这是什么意思 ?
NovoGeeek.com - 克里希纳的博客

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

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.
*/

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

显然,在最初的阶段,我们从未遇到过错误。 为了获得全部好处,我们需要在转换到严格模式后进行适当的测试,以确保我们抓住了一切。 当然,我们不只是抛掷而已。use strict在我们的代码中,假设没有错误。 因此,语句是,是时候开始使用这个非常有用的语言功能来写更好的代码了。

例如,

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

JSLint JSLint由 Douglas Crockford 撰写的调试器。 只需在您的脚本中粘贴,它就能快速扫描代码中任何明显的问题和错误。

包括use strict在您所有敏感 JavaScript 文件的起始处, 从此点起, 是一个小小方法, 可以成为一个更好的 JavaScript 程序员, 避免随机变数变成全球变数, 并且静静地变化 。