将 "strict mode" 包装在 IIFE(自调用)表达式中是一种好习惯吗?
Is it a good practice to wrap "strict mode" inside an IIFE (self-invoked) expression?
我有一个非常简单的问题要问:
每当我打算使用“use strict
”时,将代码包装在 IIFE 中是一个好习惯吗?
现在,我明白了作用域闭包的用处 (已回答
here
和
here)
或者可能更好的是,曾经如此流行的模块的用处
设计方法以及为什么 IIFE 是一个如此强大的工具
(不仅)在这些场景中,但这不是这个问题的意思
关于。
我注意到,大多数 linters (包括 jsfiddle) 确实倾向于在你想在全局范围内使用严格模式时抱怨:
将块包装在 IIFE 中似乎可以阻止 linter 抱怨
(function(){
"use strict";
console.log("I compiled!");
})();
是否有 任何基础说明为什么 use strict;
应该保留在 IIFE 中,或者这只是一个没有正当理由的 "baseless objection" ?
如果多个脚本一起捆绑到一个文件中,顶部的单个 "use strict";
会使该文件中的 所有 脚本代码变得严格,这可能会导致问题对于一些捆绑的脚本,如果它们不是为在严格模式下工作而设计的。 (如果它们包含在不同的 script
标签中,这不是问题,前提是它们是捆绑在一起的。)
Is it a good practice to wrap code inside an IIFE whenever I intend on using "use strict"
?
如果您使用的是捆绑器,可能。如果没有,那也没关系。但是,随着 ES2015 的 modules 得到更好的支持,使用模块(您现在可以使用 bundlers 来做)将是一个更好的选择,并且不需要 "use strict"
指令(ES2015+ 模块代码总是严格的)。
我认为这是因为当 use strict
被全局定义时,您最终将迫使所有第 3 方引用无法正常工作,除非它们也很严格。
现在因为你没有能力保证所有加载的资源都使用严格,你有引起麻烦的危险......
在范围内使用 "strict" 意味着范围的所有者有责任知道他的代码是否支持严格
我有一个非常简单的问题要问:
每当我打算使用“use strict
”时,将代码包装在 IIFE 中是一个好习惯吗?
现在,我明白了作用域闭包的用处 (已回答 here 和 here) 或者可能更好的是,曾经如此流行的模块的用处 设计方法以及为什么 IIFE 是一个如此强大的工具 (不仅)在这些场景中,但这不是这个问题的意思 关于。
我注意到,大多数 linters (包括 jsfiddle) 确实倾向于在你想在全局范围内使用严格模式时抱怨:
将块包装在 IIFE 中似乎可以阻止 linter 抱怨
(function(){
"use strict";
console.log("I compiled!");
})();
是否有 任何基础说明为什么 use strict;
应该保留在 IIFE 中,或者这只是一个没有正当理由的 "baseless objection" ?
如果多个脚本一起捆绑到一个文件中,顶部的单个 "use strict";
会使该文件中的 所有 脚本代码变得严格,这可能会导致问题对于一些捆绑的脚本,如果它们不是为在严格模式下工作而设计的。 (如果它们包含在不同的 script
标签中,这不是问题,前提是它们是捆绑在一起的。)
Is it a good practice to wrap code inside an IIFE whenever I intend on using
"use strict"
?
如果您使用的是捆绑器,可能。如果没有,那也没关系。但是,随着 ES2015 的 modules 得到更好的支持,使用模块(您现在可以使用 bundlers 来做)将是一个更好的选择,并且不需要 "use strict"
指令(ES2015+ 模块代码总是严格的)。
我认为这是因为当 use strict
被全局定义时,您最终将迫使所有第 3 方引用无法正常工作,除非它们也很严格。
现在因为你没有能力保证所有加载的资源都使用严格,你有引起麻烦的危险......
在范围内使用 "strict" 意味着范围的所有者有责任知道他的代码是否支持严格