JavaScript 中的“use strict”起什么作用,其背后的原因是什么?
最近,我通过 Crockford 的 JSLint 运行了我的部分 JavaScript 代码,结果出现了以下错误:
Problem at line 1 character 1: Missing "use strict" statement.
搜索后,我发现有些人会将
"use strict";
添加到他们的 JavaScript 代码中。添加该语句后,错误不再出现。遗憾的是,Google 并未透露此字符串语句背后的大部分历史。当然,这肯定与浏览器如何解释 JavaScript 有关,但我不知道会产生什么影响。
那么
"use strict";
到底是什么,它意味着什么,它是否仍然有意义?
当前是否有任何浏览器响应
"use strict";
字符串,或者它是否供将来使用?
针对 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 中使用“严格”模式(因此得名?)
:它可以帮助您减少错误,通过检测更多可能导致中断的因素。
严格模式现在 受到所有主流浏览器的支持 。
这是 ECMAScript 5 的一项新功能。John Resig 撰写了 一份很好的总结 。
它只是一个放在 JavaScript 文件中的字符串(放在文件顶部或函数内部),如下所示:
"use strict";
现在将它放入代码中不会对当前浏览器造成任何问题,因为它只是一个字符串。如果您的代码违反了编译指示,它可能会导致您的代码在将来出现问题。例如,如果您当前有
foo = "bar"
而没有先定义
foo
,您的代码将开始失败……我认为这是一件好事。
语句
"use strict";
指示浏览器使用严格模式,这是 JavaScript 的精简且更安全的功能集。
功能列表(非详尽)
-
不允许全局变量。 (捕获缺少
var
声明和变量名称中的拼写错误) -
在严格模式下,静默失败的赋值将抛出错误(分配
NaN = 5;
) -
尝试删除不可删除的属性将抛出(
delete Object.prototype
) -
要求对象文字中的所有属性名称都是唯一的(
var x = {x1: "1", x1: "2">
) -
函数参数名称必须是唯一的(
function sum (x, x) {...>
) -
禁止八进制语法(
var x = 023;
一些开发人员错误地认为前面的零不会改变数。) -
禁止使用
with
关键字 -
严格模式下的
eval
不会引入新变量 -
禁止删除纯名称(
delete x;
) -
禁止以任何形式绑定或分配名称
eval
和arguments
-
严格模式不会将
arguments
对象的属性与形式参数作为别名。 (例如在function sum (a,b) { return parameters[0] + b;} 中,这是可行的,因为
arguments[0]
已绑定到a
,依此类推。)( 请参阅下面的examples
部分以了解差异 ) -
arguments.callee
不受支持
[参考: 严格模式 , Mozilla 开发者网络 ]
示例:
- 严格模式代码不会为在严格模式中创建的参数对象属性设置别名它
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" );