Alert不是IIFE内部的功能

时间:2019-04-25 10:17:41

标签: 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);

3 个答案:

答案 0 :(得分:4)

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

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

alert(window.test)(function () { })();

…由于您已成为自动分号插入的受害者,因此无法按预期方式工作。

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

明确说明语句在何处结束。使用分号。

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);

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

var test = 0;

function makeTest() {
  let test = 10;
  alert(test);
  alert(window.test)
  {
    let test = 20;
    alert(test);
    alert(window.test);
  }
}
alert(test);
makeTest();
alert(test);

答案 1 :(得分:0)

尝试在alert(window.test)之后添加分号,这样您的代码将如下所示:

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);

答案 2 :(得分:0)

哦,分号(或缺少分号)能带来什么改变。

alert(window.test)
(function() {
  var test = 20;
  alert(test);
  alert(window.test);
})();

在第一个警报后注意缺少的分号。缺少它意味着您正在有效地执行jQuery风格的 chaining 方法-即,您的代码将IIEF视为警报返回的方法。在一个截断的示例中,这更容易可视化:

alert('foo')(function() { /* ... */ })();

由于“ foo”显然没有构成IIEF的方法,因此会出错。