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

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

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

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

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


当前回答

use strict这是一种让您的代码更安全的方法, 因为您不能使用危险特性, 这些特性不能像你预期的那样工作。 而且,正如以前所写的那样, 它使代码更加严格。

其他回答

“ 严格使用 ” ; 定义 JavaScript 代码应以“ 限制模式” 执行 。

  • ECMAScript 5版的新指令是“严格使用”指令。
  • 它不是一种声明,而是一种字面表达,被以前版本的JavaScript所忽视。
  • “严格使用”的目的是表示代码应以“严格模式”执行。
  • 在严格模式下,您不能使用未声明的变量。

所有现代浏览器支持“ 严格使用 ” , 除非因特网探索者 9 及以下.

缺点

如果开发商使用一个严格模式的图书馆, 但开发商通常使用正常模式,

更糟糕的是,由于开发商处于正常模式,他们没有被抛出额外错误的好处,因此错误可能会无声无息地失败。

此外,如上所列,严格模式阻止你做某些事情。

但有些开发商不喜欢这种限制, 并想使用语言的所有特征。

使用'use strict';不会突然让你的代码变得更好。

缩略JavaScript 严格模式的特性是ECMAScript 5。您可以在脚本/功能的顶部声明此功能,从而启用严格模式。

'use strict';

当 JavaScript 引擎看到这个时指令指令,它将开始以特殊模式解释代码。在这个模式中,当某些编码做法最终被检测出潜在的错误(这是严格模式背后的推理)时,错误就会被抛出。

考虑一下这个例子:

var a = 365;
var b = 030;

开发者在急于排列数字字面时 无意中初始化了变量b带有 八进制字元。 非限制模式会将此解读为带有值的数值字元24不过,严格模式会出错

严格模式的非详尽无遗的专门专业清单,见回答本答案.


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

  • 在我的新建新JavaScript 应用程序 :绝对!当你用代码做蠢事时 严格模式可以用作告密者

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


我如何使用严格的模式?

  1. 插入a'use strict';脚本上方的语句 :

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

    请注意文件的所有内容myscript.js将严格解释。

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

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

    里面的每样东西词汇范围函数一函数doSomething将严格解释。词汇范围在此很重要。 例如, 如果您的严格code 调用一个库的函数,即不严格,只有您的代码在严格模式下执行,而不是所谓的函数。见回答本答案以寻求更好的解释。


严格禁止什么物品?

我找到一个优雅文章说明严格禁止的若干事项(请注意,这不是一个详尽无遗的清单):

范围范围 范围范围 范围

历史上, JavaScript 被混淆了函数的范围。 有时它们看起来是静态的范围, 但有些特征让它们表现得好像是动态的范围。 这使得程序很难读懂和理解。 错误理解导致错误。 这也是一个性能问题。 静态范围界定允许在编译时发生可变的约束力, 但动态范围要求意味着约束必须推迟到运行时间, 而运行时间会受到重大的性能处罚 。

严格模式要求所有变量都固定绑定。 这意味着以前需要动态绑定的特征必须取消或修改。 具体地说,配有语句的功能被删除,而电子逆向拍卖功能改变其呼叫者环境的能力受到严重限制。

严格守则的一个好处就是 诸如YUI YUI 压缩器处理时可以做得更好。

隐含的全球变量

JavaScript 隐含了全球变量。 如果您没有明确声明变量, 则会暗含地声明一个全球变量。 这样可以让初学者更容易编程, 因为他们可以忽略一些基本的家务。 但这会让大型程序的管理更加困难, 并大大降低可靠性。 因此严格地说, 隐含的全球变量不再创建。 您应该明确声明所有变量 。

全球渗漏

有一些情况可能导致this被约束对象。例如,如果您忘记提供new调用构建器的构造器函数时的前缀this会被意外地绑定到全球对象上, 所以它不会启动新对象, 而是静静地干扰全球变量。 在这种情况下, 严格的方式将会约束thisundefined,这将导致构建者提出一个例外,使错误能够更快地被检测出来。

吵闹失败

JavaScript 一直拥有只读的属性, 但直到 ES5 的属性, 您无法自己创建这些属性 。Object.createProperty函数暴露了该功能。如果您试图为只读属性指定一个值,它会默默地失败。该配置不会改变该属性的价值,但您的程序会像原计划一样进行。这是一个完整性危险,可能导致程序出现不一致状态。严格地说,试图改变只读属性将是一个例外。

八进

数字的八进制( 或基数 8) 表示在对单词大小为 3 倍数的机器进行机器级程序时非常有用。 您在与CDC 6600 主机合作时需要八进制, 该主机的单词大小为 60 位数。 如果您可以读八进制, 您可以将一个单词看成 20 位数。 两位数字代表了操作代码, 8 个登记册中的一位数识别了其中一位数。 在机器代码向高级语言的缓慢过渡期间, 以编程语言提供八进制格式被认为是有用的 。

在C中,选择了极不幸的八进制表示:领先零。在C中,0100指64, 不是100, 和08更不幸的是,这种过时主义已经被复制为几乎所有现代语言,包括JavaScript, 在那里它只用来制造错误。它没有任何其他目的。 所以严格地说, 八进制不再被允许。

爱 爱 爱 爱 爱 爱 爱 爱 爱 爱 爱 爱 爱 爱 爱

在ES5中,伪参数数组变得有点像 ES5 中的阵列。calleecaller属性。这样就可以通过您的arguments在不放弃很多保密背景的情况下 不受信任的代码。arguments职能财产被删除。

在严格模式下,函数字典中的重复键将产生语法错误。函数不能有两个相同名称的参数。函数不能有一个与其参数之一具有相同名称的变量。函数不能有相同名称的变量。delete试图用它自己的变量delete非可配置财产现在被抛出一个例外。 原始价值不是暗含的。


未来 JavaScript 版本的预留单词

ECMAScript 5 添加了一个保留单词列表。 如果您使用它们作为变量或参数, 严格的模式会丢出错误 。 保留单词是 :

implements, interface, let, package, private, protected, public, static, 和yield


继续阅读

我的两分钱:

严格模式的目标之一是允许更快地调试问题。 它有助于开发者, 当某些错误的事情发生时, 可能导致您网页的沉默和奇怪行为时, 将例外丢弃给开发者 。 我们使用的时间 use strict,代码将排除错误,帮助开发者提前修正错误。

使用后我学到的几件重要东西 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代码会丢出错误 。

未标记引用错误: 未定义树名

消除 " 消除 "with语句:

with无法使用工具例如微克- js。它们也是折旧从未来的 JavaScript 版本中删除 。

样本 :

"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;

    for (var i = 0; i < 2; ++i) {
       // let(leafCount = i) { /*do something*/ }
    }
    for (var i = 0; i < 2; ++i) {
        with(leafCount = i) { /*do something*/ }
    }
};

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

防止重复:

当我们有重复财产时,它会提出一个例外

未标记的语法错误: 严格方式不允许以对象文字复制数据属性

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

几乎没有更多的人,但我需要获得更多这方面的知识。

添加时添加"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() { } 
    

资料来源:

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

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