我应该为我写的每一个javascript函数'使用严格'吗?
在大型AngularJS项目中使用strict的好习惯是什么?在全球范围内使用它可以打破不支持它的第三方库,但每次都"严格使用"只是重复次数.
在这个问题上,要注意过度简化的一般倾向.
首先,所有代码绝对应该以严格模式运行.核心现代javascript功能通过执行严格模式之外的代码而更改(请参阅.call()和apply())或disfigured(silent Errors).(更多关于这一点,来自Crockford.)
但是,这并没有解决您应该如何确保代码以严格模式运行的方式.至少有两种情况需要考虑:
在浏览器中,您的代码应在缩小后传递.如果你包含'use strict'
在每个函数体中,你的minifier将不会将它剥离出来,并且你将浪费在任何地方重复它的字节.您只需要在最外面的函数范围中 - 在模块定义的顶部.一种方法是将缩小的代码包装在单个IIFE闭包中作为构建过程的一部分:
;(function (){ 'use strict' // All code here. }())
我认为这接近理想的做法,但它或多或少地要求你采用持续集成工作流程(因为,为了观察你的代码在严格模式下运行,你必须把它全部包裹起来一个闭包) .如果不以这种方式工作,则必须将use strict
指令包含在未在另一个函数范围内声明的每个函数的顶部.
当然,在服务器上,它更简单.代码不会缩小,字节无关紧要,因此您只需将use strict
指令包含在每个文件的顶部即可.
警告--use_strict
:如果您控制脚本的运行方式,您可能会发现自己很想使用--use_strict
运行时标志.这很简单,但这意味着所有依赖项必须符合严格模式.由于您无法控制每个第三方的合规性,因此这通常是不明智的.
您编写的所有代码1 都应该处于严格模式.它可以帮助您通过不忽略异常来捕获错误.
但是,不,这并不意味着您需要在"use strict";
每个function
定义前加上,您只应将它放在模块范围内 - 每个文件一次 - 以便它被所有函数继承.当你要切换到ES6模块时,无论如何都会暗示.
1:我甚至争论全局启用它,因为严格模式不应该破坏任何正确编写的代码.
如果它确实破坏了第三方脚本,解决方案可能不会再次禁用严格模式...
简短的回答,是的!您不需要为每个函数包含它,而是每个JavaScript文件只需添加一次.当你启动文件时,从这样的闭包开始:
(function () { "use strict"; // Rest of your code. })();