对于我写的每一个javascript函数,我都应该使用strict吗?
在大型AngularJS项目中使用strict有什么好的做法?在全球范围内使用它可能会破坏不支持它的第三方库,但每次执行“严格使用”只是重复次数。
答案 0 :(得分:15)
关于这个问题,请注意过度简化的一般倾向。
首先,您的所有代码绝对应该在严格模式下运行。通过执行严格模式之外的代码,核心现代javascript功能已更改(请参阅.call() and apply())或已毁坏(silent Errors)。 (更多关于此here,来自Crockford。)
但是,这并未解决 应确保代码以严格模式运行的方式。至少有两种情况需要考虑:
在浏览器中,您的代码应在缩小后传递。如果在每个函数体中都包含'use strict'
,那么你的minifier就不会将它删除掉,而且你会浪费掉在任何地方重复它的字节。您只需要在最外面的函数范围中 - 在模块定义的顶部。一种方法是将缩小的代码包装在单个IIFE闭包中作为构建过程的一部分:
;(function (){
'use strict'
// All code here.
}())
我认为这接近理想的做法,但它或多或少地要求你采用持续集成工作流程(因为,为了观察你的代码在严格模式下运行,你必须把它全部包裹起来一个关闭)。如果不以这种方式工作,则必须在每个未在另一个函数范围内声明的函数的顶部包含use strict
指令。
在服务器上,当然要简单得多。代码没有缩小,字节无关紧要,因此您只需在每个文件的顶部包含use strict
指令。
--use_strict
上的警告:如果您控制脚本的运行方式,您可能会发现自己很想使用--use_strict
运行时标志。这很容易,但这意味着所有依赖必须符合严格模式。由于您无法控制每个第三方的合规性,这通常是不明智的。
答案 1 :(得分:11)
您编写 1 should的所有代码都在strict mode。它helps you catch mistakes不忽略异常。
但是,没有,这并不意味着您需要在每个"use strict";
定义中添加function
,您只应将其放在模块范围内 - 每个文件一次 - 这样它就可以被你的所有功能继承。无论如何,当你要切换到ES6模块it will be implied时。
1:我甚至争论全局启用它,因为严格模式不应该破坏任何正确编写的代码。
如果 打破第三方脚本,解决方案可能不会再次禁用严格模式...
答案 2 :(得分:7)
简短的回答,是的!您不需要为每个函数包含它,而是每个JavaScript文件只需添加一次。当你启动文件时,请从这样的闭包开始:
(function () {
"use strict";
// Rest of your code.
})();
答案 3 :(得分:4)
没有。冗余不是必需的。使用声明
"use strict";
在文件或流范围是可取的,尤其是在使用第三方库的情况下。它有助于决定是按原样使用它们,包装它们还是传递它们。
文件级自执行功能
在自动执行的闭包中看到整个文件或流变得越来越普遍。在这种情况下,使用严格模式(上面)的声明被插入到闭包的第一行,其中......是。
(function () {
...
}())
可能有必要提一下,自我执行并不总是必要的,如果过度使用,实际上可能导致负载缓慢和其他问题。
更多关于声明范围
范围取决于您是将声明置于函数内部还是外部,并且适用于封闭范围内声明之后的所有声明。
如果所有文件或流已经与更严格的模式兼容或者可以轻松地使用,则在函数内部使用声明是错误的方法。冗余是不必要的,因此建议使用声明放在文件顶部或流的开头。
有时只有部分功能符合更严格的规则。在这种情况下,声明的不太理想的功能范围可用于鼓励更精细的编码实践,至少在已经遵守的功能中。
为何选择严格的模式?
从语言设计的角度来看,严格模式消除了某些被认为不太理想的允许语言解析和执行特征。这些非严格模式语言特性被认为是向后兼容的默认行为。概要和细节出现在这里。
当Netscape早期的这些旧语言特性被弃用或者某些时候严格模式是否会成为浏览器的默认行为时,并没有明确定义,但更严格的模型可能会产生更少模糊和风险的来源。如果您希望提高编码实践和代码库的可维护性,可移植性和可扩展性,那么严格模式是一个不错的选择。
注意对于那些来自"What's the benefit of using "function() 'use strict'” in every file?"
的人你可以放置
"use strict";
位于代码序列的顶部或函数内部,因此每个文件或每个函数只有一行代码。
其他代码行在代码here中有其他用途。
有些人将整个文件放在一个自动执行的函数中,但在每种情况下都不是必需的。