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

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

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

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

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


当前回答

如果您使用在过去一年左右释放的浏览器, 那么它很可能支持 JavaScript 严格模式。 只有 ECMAScript 5 之前的旧浏览器才成为当前标准, 不支持它 。

命令周围的引号确保代码在旧浏览器中仍然有效(尽管那些在严格模式下产生语法错误的东西通常只会导致脚本在旧浏览器中发生一些难以探测的故障 ) 。

其他回答

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

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

例如,

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

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

请注意use strictEcmaScript 5从那时起,一直被扣留着。

以下是触发严格模式的条件欧 6欧 7:

  • 全球守则是严格的模式代码,如果它从含有使用严格指令的指令前言开始(见14.1.1)。
  • 模块代码总是严格的模式代码。
  • A. 所有部分类 声明或 a/类压是严格的模式代码。
  • Eval 代码是严格的模式代码,如果它从含有“使用严格指令”的指令前言开始,或者如果对 Eval 的号召是包含在严格模式代码中的直接电子逆向拍卖(见12.3.4.1)的话。
  • 函数代码是严格模式代码,如果相关功能声明、功能显示、发电机声明、发电机声明、方法定义或箭头功能包含在严格模式代码中,或者如果生成函数 [[ECMAScriptCode]] 内部空格值的代码以包含使用严格指令的指令前导开始。
  • 作为内置函数和发电机构造器的参数而提供给内置函数和发电机构造器的函数代码是严格模式代码,如果最后一个参数是字符串,当处理时是函数Body首先是包含使用严格指令的指令前言。

ECMAScript 5采用了JavaScript“严格”模式。

(function() {
  "use strict";
  your code...
})();

书写"use strict";在您的 JS 文件的顶端, 打开严格的语法检查 。 它为我们执行以下任务 :

  1. 如果您试图指定给一个未声明的变量,则显示错误。

  2. 停止您覆盖关键 JS 系统库

  3. 禁止某些不安全或容易出错的语言特征

use strict也属于个别职能内的工作。use strict在你的代码。

浏览器兼容性问题 : “ 使用” 指令意在向后兼容。 不支持这些指令的浏览器将只看到一个字符串字典, 但没有进一步引用。 因此, 他们将会通过它继续前进 。

使用'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也许值得看看这篇文章:

在浏览器中支持 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.
*/