【问题标题】:How does an iife help in variable name collisions & in not polluting the global scope (as opposed to regular non-iife functions)? [duplicate]iife 如何帮助变量名冲突和不污染全局范围(与常规的非 iife 函数相反)? [复制]
【发布时间】: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


【解决方案1】:

我说 iife 对变量名冲突没有帮助,但对函数名冲突有帮助吗?

是的,IIFE 不会污染全局命名空间,因为函数 itaelf 以及在其中声明的变量都不属于全局范围。

即使是普通的非 iife 函数中的变量也是局部作用域的,不会与全局变量冲突,不是吗?

只要你声明它们(很多人忘记了),是的。

所以,简而言之,当他们谈论污染全球范围时,特别是 w.r.t.一个 iife,他们在谈论不污染范围 w.r.t.方法名而不是变量名?

实际上两者都有,因为您需要隐藏变量的函数和隐藏函数的 IIFE。

【讨论】:

  • Actually both. 函数内的任何变量(如果用 var 声明)永远不会污染 iife 或常规函数。这不是应该归功于生活的好处。
猜你喜欢
  • 2018-11-29
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-12-15
  • 2021-10-04
  • 1970-01-01
  • 2020-05-21
相关资源
最近更新 更多