关于ECMAScript 5:为什么在JavaScript库中使用”strict mode”?

Why using `strict mode` in JavaScript libraries?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
What does"use strict" do in JavaScript, and what is the reasoning behind it?

实际上,我知道use strict在javascript中的作用,正如这里提出的问题:在JavaScript中,"使用严格"是做什么的,它背后的推理是什么?

但我不明白为什么要在JavaScript库中使用strict模式?我是说使用它有什么好处?


您链接的问题、答案和其中给出的参考文献列出了使用严格模式的一系列原因。

让我说出其中的一个:暗含全球恐怖分子

非严格代码:

1
2
3
4
5
6
7
8
9
function foo(a) {
    var myvar;

    myar = a * 4;

    // ...

    return myvar;
}

现在,这个代码:

1
console.log(foo(2));

…应该记录"8",对吗?但它不是,它总是记录"未定义的":

1
2
3
4
5
6
7
8
9
10
function foo(a) {
    var myvar;

    myar = a * 4;

    // ...

    return myvar;
}
console.log(foo(2));

此外,它还悄悄地创建了一个名为myar的全局变量。为什么?因为我的代码有错别字(我在设置为a * 4时漏掉了myvar中的v)。

比较:

1
2
3
4
5
6
7
8
9
10
11
function foo(a) {
   "use strict";
    var myvar;

    myar = a * 4;

    // ...

    return myvar;
}
console.log(foo(2));

现在,我不再创建奇怪的返回值和全局变量,而是得到一条很好的错误消息:ReferenceError:"myar" is not defined

现在,可以使用lint工具来完成严格模式的特定方面。但是,当您试图修复某些东西,并在编辑器和浏览器之间来回切换时,您并不总是在Anger工具链中使用lint工具进行编码。所以当浏览器帮你解决问题的时候感觉很好。

另外,strict模式做了lint工具不能做的事情,比如不允许with、在不设置它的函数调用中更改this的默认值等。