开发者问题收集

JavaScript 中的“use strict”起什么作用,其背后的原因是什么?

2009-08-26
1219766

最近,我通过 Crockford 的 JSLint 运行了我的部分 JavaScript 代码,结果出现了以下错误:

Problem at line 1 character 1: Missing "use strict" statement.

搜索后,我发现有些人会将 "use strict"; 添加到他们的 JavaScript 代码中。添加该语句后,错误不再出现。遗憾的是,Google 并未透露此字符串语句背后的大部分历史。当然,这肯定与浏览器如何解释 JavaScript 有关,但我不知道会产生什么影响。

那么 "use strict"; 到底是什么,它意味着什么,它是否仍然有意义?

当前是否有任何浏览器响应 "use strict"; 字符串,或者它是否供将来使用?

3个回答

针对 ES6 模块的更新

本机 ECMAScript 模块 (带有 import export 语句)和 ES6 类 中,严格模式始终处于启用状态,无法禁用。

原始答案

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

引用一些有趣的部分:

Strict Mode is a new feature in ECMAScript 5 that allows you to place a program, or a function, in a "strict" operating context. This strict context prevents certain actions from being taken and throws more exceptions.

以及:

Strict mode helps out in a couple ways:

  • It catches some common coding bloopers, throwing exceptions.
  • It prevents, or throws errors, when relatively "unsafe" actions are taken (such as gaining access to the global object).
  • It disables features that are confusing or poorly thought out.

另请注意,您可以将“严格模式”应用于整个文件...或者您只能将其用于特定功能 (仍然引用 John Resig 的文章)

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code...

如果您必须混合使用新旧代码,这可能会有所帮助 ;-)

所以,我想它有点像 “使用您可以在 Perl 中使用“严格”模式(因此得名?) :它可以帮助您减少错误,通过检测更多可能导致中断的因素。

严格模式现在 受到所有主流浏览器的支持

Pascal MARTIN
2009-08-26

这是 ECMAScript 5 的一项新功能。John Resig 撰写了 一份很好的总结

它只是一个放在 JavaScript 文件中的字符串(放在文件顶部或函数内部),如下所示:

"use strict";

现在将它放入代码中不会对当前浏览器造成任何问题,因为它只是一个字符串。如果您的代码违反了编译指示,它可能会导致您的代码在将来出现问题。例如,如果您当前有 foo = "bar" 而没有先定义 foo ,您的代码将开始失败……我认为这是一件好事。

seth
2009-08-26

语句 "use strict"; 指示浏览器使用严格模式,这是 JavaScript 的精简且更安全的功能集。

功能列表(非详尽)

  1. 不允许全局变量。 (捕获缺少 var 声明和变量名称中的拼写错误)

  2. 在严格模式下,静默失败的赋值将抛出错误(分配 NaN = 5;

  3. 尝试删除不可删除的属性将抛出( delete Object.prototype

  4. 要求对象文字中的所有属性名称都是唯一的( var x = {x1: "1", x1: "2">

  5. 函数参数名称必须是唯一的( function sum (x, x) {...>

  6. 禁止八进制语法( var x = 023; 一些开发人员错误地认为前面的零不会改变数。)

  7. 禁止使用 with 关键字

  8. 严格模式下的 eval 不会引入新变量

  9. 禁止删除纯名称( delete x;

  10. 禁止以任何形式绑定或分配名称 evalarguments

  11. 严格模式不会将 arguments 对象的属性与形式参数作为别名。 (例如在 function sum (a,b) { return parameters[0] + b;} 中,这是可行的,因为 arguments[0] 已绑定到 a ,依此类推。)( 请参阅下面的 examples 部分以了解差异

  12. arguments.callee 不受支持

[参考: 严格模式 Mozilla 开发者网络 ]


示例:

  1. 严格模式代码不会为在严格模式中创建的参数对象属性设置别名它
function show( msg ){
    msg = 42;
    console.log( msg );          // msg === 42
    console.log( arguments[0] ); // arguments === 42
}
show( "Hey" );

// In strict mode arguments[i] does not track the value of 
// the corresponding named argument, nor does a named argument track the value in the corresponding arguments[i]
function showStrict( msg ){
    "use strict";
    msg = 42;
    console.log( msg );          // msg === 42
    console.log( arguments[0] ); // arguments === "Hey"
}
showStrict( "Hey" );
gprasant
2014-11-24