最近,我通过克罗福德 查了一些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 撰写的调试器。 只需在您的脚本中粘贴,它就能快速扫描代码中任何明显的问题和错误。

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

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

"use strict";

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

可比较的小例子 :

无限制模式 :

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

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


继续阅读

更新ES6模块的更新

ECMAScript 本地 ECMAScript 模块(与importexport和 报表)和ES6 类,严格模式总是被启用,不能被禁用。

原始答复原文

您可能感兴趣的关于 Javascript 严格模式的这篇文章 :John Resig - ECMAScript 5 严格模式, JSON 等

引用一些有趣的部分:

严格模式是 ECMAScript 5 中的新特征, 它允许您在“ 严格” 操作背景下设置程序或函数。 这种严格环境防止某些行动被采取, 并增加了一些例外 。

并且:

严格模式在几个方面有帮助:

  • 它捕捉到一些常见的编码布丁, 抛出例外。
  • 当采取相对的“不安全”行动(例如进入全球天体)时,它会防止错误或错误。
  • 它使那些令人困惑或考虑不周的特征无法发挥作用。

另请注意, 您可以将“ 限制模式” 应用到整个文件... , 或者只能用于特定函数(仍在引用John Resig的文章):

// Non-strict code...

(function(){
  "use strict";

  // Define your library strictly...
})();

// Non-strict code...

如果你必须混合新旧代码和旧代码,

所以,我想这有点像"use strict"可在 Perl 中使用(因此命名? )它可以帮助您减少错误, 通过检测更多可能导致破碎的东西。

严格模式为现在由所有主要浏览器支持.