【发布时间】:2018-12-16 05:26:55
【问题描述】:
我读了很多关于 iife 的用途之一是帮助解决命名空间冲突以及它如何使意外影响全局对象和污染全局范围变得困难。以及它如何带来更安全的代码。
我的问题是,所有这些都已经发生在一个没有立即调用的函数中。我们是否特别需要终身寿险来获得这些好处?使用 IIFE 并因此隐藏和创建单独的环境与常规功能有何不同?在 iife 中,变量是本地的(因此它们不会污染全局范围),但在非 iife 函数中也是如此。
我说 iife 对 variable 名称冲突没有帮助,但对 function 名称冲突有帮助吗?即使是普通的非 iife 函数中的变量也是局部作用域的,不会与全局变量冲突,不是吗?
所以,简而言之,当他们谈论污染全球范围时,特别是 w.r.t.一个 iife,他们在谈论不污染范围 w.r.t. 方法名而不是变量名?
【问题讨论】:
-
IIFE 不会像
function foo(){}或var foo = function(){}那样在全局命名空间中留下任何“痕迹”。并且区分函数名称和变量名称是相当学术的,当不污染全局命名空间是目标 - 你的代码中的一个(例如我可能作为第 3 方库导入)覆盖 my i>foo无关紧要。 -
再一次,这完全是为了不留下 function 名称污染的痕迹,而不是 variable 名称污染,对吧?
-
名字就是名字。变量和函数没有单独的命名空间。
-
@melpomene 名称是名称,但只有 function 名称会在全局范围内留下痕迹,而不是其中的变量。函数
function foo(){}或var foo = function(){}会留下痕迹,但其中的任何变量都不会。所以有细微的差别。我再说一遍,更多的是函数名称造成的污染,而不是变量名称? -
@KumarManish 是的。 (另请参阅链接问题的答案。)
标签: javascript iife