Alert 不是 IIFE 内部的函数

Ste*_*der 0 javascript

一旦执行上下文进入 IIFE,它就会说alert 不是一个函数。关于 IIFE 有什么我需要了解的具体事情吗?或者我做错了什么?

var test = 0;

function makeTest() {
  var test = 10;
  alert(test);
  alert(window.test)
    (function() {
      var test = 20;
      alert(test);
      alert(window.test);
    })();
}
alert(test);
makeTest();
alert(test);
Run Code Online (Sandbox Code Playgroud)

Que*_*tin 5

它说alert(...)不是一个函数,不是alert不是一个函数。

\n\n

您的代码正在尝试执行此操作:

\n\n
alert(window.test)(function () { })();\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xe2\x80\xa6 因为您成为自动分号插入的受害者,无法按您预期的方式工作。

\n\n

即您正在调用匿名函数的返回alert()并将其作为参数传递。

\n\n

明确语句的结束位置。使用分号。

\n\n

\r\n
\r\n
alert(window.test)(function () { })();\n
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n\n

或者在块中使用let而不是 IIFE:

\n\n

\r\n
\r\n
var test = 0;\r\n\r\nfunction makeTest() {\r\n  var test = 10;\r\n  alert(test);\r\n  alert(window.test);\r\n  (function() {\r\n    var test = 20;\r\n    alert(test);\r\n    alert(window.test);\r\n  })();\r\n}\r\nalert(test);\r\nmakeTest();\r\nalert(test);
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

  • @appleapple — 固定的缩进是由于我在将 OP 的代码转换为可运行的演示时点击 Tidy 造成的。 (2认同)