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

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

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

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

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


当前回答

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

您可以引用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当你试着读的时候

其他回答

严格模式消除了在非限制模式下会忽略的错误,从而使javascript " 更安全 " 。

是否认为它是最佳做法之一?

是 是,它被认为是最佳做法的一部分, 与 Javascript 合作,包括严格模式。这样做的方式是在你的联署材料档案中添加以下代码行。

'use strict';

在你的代码。

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

说明代码应该严格解释 向浏览器这样的用户代理指定 他们应该把代码 完全像书面的一样对待 如果代码不合理的话 就会出错

例如:考虑在.js您的文件有以下代码:

设想情景1:[无严格模

var city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago

设想情况2:[无严格模

city = "Chicago"
console.log(city) // Prints the city name, i.e. Chicago

为何在两种情况下都打印变量名称?

不打开严格模式,用户代理商经常对问题代码进行一系列修改,以试图使问题代码变得合理。在表面上,这看似是一件好事,事实上,在严格模式之外工作使得人们有可能在不把所有细节都固定下来的情况下,用JavaScript代码湿透脚部。然而,作为一个开发者,我不想在我的代码中留下一个错误,因为我知道它可能会在晚些时候回来咬我,我还只是想写好代码。这就是严格模式有助于解决问题的地方。

设想方案3:[严格示范

'use strict';

city = "Chicago"
console.log(city) // Reference Error: asignment is undeclared variable city.

附加提示 :要使用严格模式保持代码质量, 您不需要一次又一遍地写入, 特别是如果您有多个.js您可以在eslint规则如下:

文件名 : .eslintrc.js

module.exports = {
    env: {
        es6: true
    },
    rules : {
        strict: ['error', 'global'],
        },
    };
    

那么,什么是严格防止的呢?

  • 使用变量而不声明这将以严格的方式丢弃一个错误。 这是为了防止您在应用程序中无意中创建全局变量。 打印芝加哥的例子特别覆盖了这一点 。

  • 删除变量或函数或参数严格情况下是无的。

    "use strict";
     function x(p1, p2) {}; 
     delete x; // This will cause an error
    
  • 复制参数名称严格允许。

     "use strict";
     function x(p1, p1) {};   // This will cause an error
    
  • 不允许以 Javascript 语言保留单词字词是工具界面,让,包,包,私人,受保护,公开,静态和产出

若要列出更全面的清单, 请在此检查 MDN 文件 :https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode

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

开发者应该使用的主要理由"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. 将限制关键字作为变量的使用。 试图使用关键字将会丢弃错误 。

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

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

添加时添加"use strict";中,下列情况将投语法错误在脚本执行之前:

  • 为未来的ECMAScript版本铺路,使用一个新保留的关键关键关键关键词(在ECMAScript 6): implements, interface, let, package, private, protected, public, static, 和yield.

  • 在区块中声明函数

    if(a<b){ function f(){} }
    
  • 八进语法

    var n = 023;
    
  • this点对全局对象。

     function f() {
          "use strict";
          this.a = 1;
     };
     f(); 
    
  • 在对象字典中为属性名称声明相同名称的两倍

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

    ECMACcript 6 (ECMAScript 6)已不再属于这种情况(ECOMACcript 6) (EECMAScript 6) (EECMACcript 6) (EECMACcript 6) (EECMACcript 6)) 。昆虫 1041128).

  • 以相同名称函数宣告两个函数参数

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

    function f(x){
       "use strict";
       var a = 12;
       b = a + x*35; // error!
    }
    f();
    
  • 使用delete在变量名称上delete myVariable;

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

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

资料来源:

严格模式允许在 v8 引擎中设置严格的特性。 某些特性的短示例 :

您可通过写作方式在全球范围启用它 :

'use strict'; // strict mode enabled!

您只是在函数中包含的每个函数 :

let myfunc = () => {
  'use strict'; // strict mode enabled
  
   b = 0; // broke
}
  • 在使用该变量( sane imo) 之前, 您必须声明变量 :
  var x;
  x = '0'; // ok
  y = '';  // not ok
  • 已经启用 es6 功能( 取决于浏览器) , 因为节点 v4+ 很重要 。

  • 在某些情况下,业绩更好。

还有更多的特征,检查在这里更多! 更多! 更多! 更多! 更多!