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

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

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

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

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


当前回答

可比较的小例子 :

无限制模式 :

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

其他回答

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

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

更新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 中使用(因此命名? )它可以帮助您减少错误, 通过检测更多可能导致破碎的东西。

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

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

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

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

可比较的小例子 :

无限制模式 :

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

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