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

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

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

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

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


当前回答

"use strict"使 JavaScript 代码运行到严格限制模式使用严格模式的主要原因是避免意外地在全球使用未定义的方法。

严格地说,事情跑得更快, 一些警告或无声警告 扔出致命错误, 最好总是用它来做一个更干净的代码。

"use strict"EECMA5广泛需要广泛使用。在 ECMA6 中它默认为 JavaScript 的一部分,所以如果你使用ES6, 不需要添加。

看看这些声明和MDN的例子:

“严格使用”指令
JavaScript 1. 8.5 (ECMAScript 版本 5) 的“ 严格使用” 指令是新的 JavaScript 1. 8.5 (ECMAScript 版本 5) 。 它不是一个声明,而是一个字面表达, 先前版本的 JavaScript 忽略了它。 “ 严格使用” 的目的是表示代码应在“ 严格模式” 中执行。 例如, 严格模式下, 您不能使用未声明的变量 。

使用“ 严格使用” 的例子 :
功能的严格模式 : 同样, 要对函数使用严格的方式, 请在函数的正文中将确切的语句“ 使用严格 ” ; (或“ 使用严格 ” ) 置于任何其他语句之前 。

(1) (1) 功能的严格模式

 function strict() {
     // Function-level strict mode syntax
     'use strict';
     function nested() { return 'And so am I!'; }
     return "Hi!  I'm a strict mode function!  " + nested();
 }
 function notStrict() { return "I'm not strict."; }

 console.log(strict(), notStrict());

2) 完全上标的严格模式

'use strict';
var v = "Hi! I'm a strict mode script!";
console.log(v);

(3) (3) 转让给不可撤销的全球转让

'use strict';

// Assignment to a non-writable global
var undefined = 5; // throws a TypeError
var Infinity = 5; // throws a TypeError

// Assignment to a non-writable property
var obj1 = {};
Object.defineProperty(obj1, 'x', { value: 42, writable: false });
obj1.x = 9; // throws a TypeError

// Assignment to a getter-only property
var obj2 = { get x() { return 17; } };
obj2.x = 5; // throws a TypeError

// Assignment to a new property on a non-extensible object.
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = 'ohai'; // throws a TypeError

你可以MDN 上更多读取.

其他回答

提醒大家小心,你们所有硬收费程序设计员:"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";中,下列情况将投语法错误在脚本执行之前:

  • 为未来的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() { } 
    

资料来源:

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

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

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

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

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

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

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

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

严格模式对普通 JavaScript 语义进行若干修改 :

  • 将一些 JavaScript 沉默错误修改为丢弃错误,从而消除这些错误 。

  • 修正错误, 使 JavaScript 引擎难以执行优化 。

  • ECMAScript禁止今后版本的ECMAScript可能界定的某种语法。

用于获取更多信息严格模式 Javascript

可比较的小例子 :

无限制模式 :

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