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

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

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

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

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


当前回答

这是ECMAScript 5. 约翰·瑞西格写的新特写精美的摘要来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来,来

您在 JavaScript 文件( 文件顶部或函数内部) 中插入的字符串, 看起来像 :

"use strict";

在您的代码中输入它不会对当前浏览器造成任何问题, 因为它只是一条字符串。 如果您的代码违反 pragma , 它可能会在未来对您的代码造成问题 。 例如, 如果您有foo = "bar"未定义foo首先,你的代码将开始失败... 这在我看来是件好事

其他回答

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

资料来源:

使用'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


继续阅读

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

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

提醒大家小心,你们所有硬收费程序设计员:"use strict"现有的代码可能危险! 这东西不是某种感觉良好、 快乐的贴纸, 你可以用它来“ 更好 ” 。"use strict"pragma, 浏览器会突然在它以前从未丢弃的随机地点出现Thalrow例外, 仅仅因为在那个地点你正在做一些 默认的/失败的 JavaScript 乐于允许但严格的 JavaScript 憎恶的东西! 您可能会在代码中很少使用的电话中隐藏严格违反规则的情况, 这些电话只有在他们最终逃跑时才会扔出例外 - 比如, 在您的付费客户所使用的生产环境中!

如果你要跳下去, 申请是一个很好的主意"use strict"与综合单元测试和严格配置的 JSHint 构建任务同时进行综合单元测试和严格配置的 JSHint 构建任务, 这将使你有信心你的模块没有黑暗的角落, 仅仅因为你打开了严格模式, 就会可怕地爆炸。 或者, 嘿, 这里还有一个选项: 不要添加"use strict"对你的任何遗产代码, 它可能更安全 这样,诚实地说。绝对不做添加 添加"use strict"用于您没有拥有或维持的模块,如第三方模块。

我想,即使它是一个致命的笼子动物,"use strict"可以是好东西, 但你必须做对。 最好严格的时候是您的项目是绿地, 而您是从零开始的。 配置JSHint/JSLint和所有警告和选择 调出所有的所有警告和选择 调得越紧,你的团队可以 胃,得到一个良好的建设/测试/资产系统Grunt+Karma+Chai,并且只有当时N才会开始将您所有的新模块标记为"use strict"准备纠正大量乳臭错误和警告。确保每个人都了解重力,将建筑配置为FAIL,如果JSHint/JSLint产生任何违反行为。

当我通过我的项目时,我的项目不是一个绿地项目"use strict"结果,我的IDE 满是红标记 因为我没有"use strict"我一半的模块,JSHint抱怨这一点。这提醒我,我将来应该做什么。我的目标是,因为我失踪了,所以没有红色标记。"use strict"声明,但这已经是多年之后的事了。

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

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

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