匿名自执行js函数内的全局变量仍可在外部使用?

时间:2015-03-28 15:02:36

标签: javascript

我有这两个javascript文件:

test1.js:
(function() {
  console.log(global_var_test2);
})();

test2.js:
(function() {
  global_var_test2 = "test";
})();

显然如果我在test2.js中使用var关键字,global_var_test2变量将在test1.js中不可用。但我认为当你将所有代码包装在一个自执行匿名函数中的文件中时创建了一个单独的范围,以便在没有var关键字的情况下创建的变量在外面仍然不可见?运行上面的代码时,我无法访问test1.js中的global_var_test2。

如果我记得正确使用自动执行的匿名函数几乎总是在编写javascript模块时将其与其他可能已安装的模块隔离开来..但这似乎不适用于上面的代码..可能有人解释为什么不呢?

2 个答案:

答案 0 :(得分:3)

您的理解不正确。如果在没有用var声明的情况下分配给变量,那么您将创建一个全局变量,包装器或没有包装器。

在“严格”模式下,这将是一个错误。因此,如果你真的想确保你没有污染全球环境 - 这很聪明 - 你将你的代码置于“严格”模式:

(function() {
  "use strict";
   // ... your code here
})();

如果意外忘记var,则会收到错误消息。如果您想要全局变量,您可以检查它:

  if ("myGlobalSymbol" in window)
    throw new Error("Something stole myGlobalSymbol from me!");

或其他什么。

答案 1 :(得分:1)

在函数外部使用var创建的变量是全局的 - 就像您没有使用var一样。 由于您通过var myvarwindow.myvar = stuff定义所有变量,因此立即调用的函数用于防止您的var语句污染全局环境和可能导致冲突。