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

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

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

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

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


当前回答

声明声明"use strict"; 指示浏览器使用严格模式,该模式是JavaScript的简化和安全功能集。

特征清单(并非详尽无遗)

  1. 丢弃全局变量 。var以变量名称填报声明和打字)

  2. 静音失灵任务会以严格的方式丢出错误( 指派)NaN = 5;)

  3. 试图删除不可迁移属性的尝试将会丢弃( ) 。delete Object.prototype)

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

  5. 函数参数名称必须是独有的( V)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等) (......) (见见examples下一节,以了解差异)

  12. arguments.callee不支持不支持

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


实例:

  1. 严格模式代码不使用在其中创建的参数对象的别名属性
function show( msg ){
    msg = 42;
    console.log( msg );          // msg === 42
    console.log( arguments[0] ); // arguments === 42
}
show( "Hey" );

// In strict mode arguments[i] does not track the value of 
// the corresponding named argument, nor does a named argument track the value in the corresponding arguments[i]
function showStrict( msg ){
    "use strict";
    msg = 42;
    console.log( msg );          // msg === 42
    console.log( arguments[0] ); // arguments === "Hey"
}
showStrict( "Hey" );

其他回答

“ 严格使用 ” ; 是程序员不会使用 JavaScript 的松散特性或坏特性的保险 。 它是一种指南, 就像标尺会帮助您做直线。 “ 严格使用” 有助于您做“ 交易编码 ” 。

那些不愿使用统治者直线行事的人 通常最终会出现在那些网页上 要求其他人调试他们的代码

相信我 与设计不当的代码相比 间接费用微不足道多年来一直担任高级JavaScript开发商的Doug Crockford,个人来说,我一直想回到他的网站 以确保我不会忘记我的好做法

现代 JavaScript 实践应该总是引用“严格使用”;ECMA集团之所以将“Scrit”模式作为任择模式的唯一原因允许经验较少的编码员进入JavaScript, 并给予时间适应新的和安全的编码做法。

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

您可以引用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"它们是:

  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. 将限制关键字作为变量的使用。 试图使用关键字将会丢弃错误 。

简言之,你的代码将减少容易出错的程度,反过来又将使得你写好代码。

更多信息,请查看在这里.

可比较的小例子 :

无限制模式 :

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

无限制模式 :

String.prototype.test = function () {
  console.log(typeof this === 'string');
};

'a'.test();

// output
// false

String.prototype.test = function () {
  'use strict';
  
  console.log(typeof this === 'string');
};

'a'.test();

// output
// true

JavaScript由于浏览器战争和管理不善而匆忙设计和实施,导致许多设计决定不善,不直观的语法和混乱的语义被混为一谈。 严格模式旨在修正其中的一些错误。

但是,在不创造替代解释的情况下纠正这些错误会打破后向兼容性。所以,"use strict"指令规定对代码的替代解释,同时将其告知程序员。

例如,this关键字在方法定义中指向对象,例如thisself以其他语文提供。

let o = {
  name: 'John Doe',
  sayName: function(){
    console.log(this.name);
  }
};

o.sayName(); // 'John Doe'

this方法上下文外没有目的,但所有 JavaScript 函数都具有this关键字是否为方法 :

function run() {
  console.log(this);
}

run(); // Window

this确定全球对象,因为全球对象在范围中已经存在,所以它毫无意义,没有意义。

严格方式this在一个全球职能中,我们决心作出不确定的决定,这正是我们所期望的。

"use strict"

function run() {
  console.log(this);
}

run(); // undefined

有些错误即使严格的方式也无法固定,因为语法对旧浏览器应该有效,因为它们忽略了"strict mode"这是按设计设计的指令。