一旦执行上下文进入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);
答案 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的方法,因此会出错。