为什么在JavaScript库中使用“严格模式”?

32

你的答案已经在SO上了。1 - rg88
2
在库中使用它的原因与通常使用它的原因相同,就像你在问题中提到的那样。你认为仅仅因为它是库代码就有所不同吗? - T.J. Crowder
1
我投票关闭重复问题,因为我没有看到这里的答案与已经给出的答案有任何不同或更清晰。 - moribvndvs
@T.J.Crowder但我不理解在一般情况下如何使用它。我说在库中是因为我在jQuery中看到了它,没有更多的了解。 - Afshin Mehrabani
@AfshinMehrabani:你读了你链接的问题及其答案和参考资料,还是无法理解使用严格模式的好处吗?也许你可以就列出的众多好处之一提出一个具体的问题,并解释为什么你看不到它的意义? - T.J. Crowder
1个回答

10

您链接的问题、它的回答以及提供的参考资料列出了许多使用严格模式的原因。

让我只提出其中一个原因: 隐式全局变量之恐怖¹

非严格模式的代码:

function foo(a) {
    var myvar;

    myar = a * 4;

    // ...

    return myvar;
}

现在,这段代码:

console.log(foo(2));

...应该打印出"8",但实际上并没有,它总是打印出"undefined":

function foo(a) {
    var myvar;

    myar = a * 4;

    // ...

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

而且更重要的是,它会自动创建一个名为myar的全局变量。为什么?因为我在代码中犯了一个拼写错误(在将其设置为a * 4时,我错过了myvar中的v)。

与之对比:

function foo(a) {
    "use strict";
    var myvar;

    myar = a * 4;

    // ...

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

现在,相比之前产生一个奇怪的返回值和全局变量,我得到了一个友好的错误信息:ReferenceError:"myar"未定义

现在,使用严格模式的这一特定方面可以通过使用lint工具来完成。但是当您只是试图修复某些问题并在编辑器和浏览器之间反弹时,并不总是涉及到lint工具。所以当浏览器帮助您时会很好。

此外,严格模式还执行了无法由lint工具执行的操作,如禁止with,更改没有设置它的函数调用中this的默认值等。


¹ (那是我瘦弱的小博客上的一篇文章)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接