【问题标题】:Why iife not working in a simple example?为什么 iife 不能在一个简单的例子中工作?
【发布时间】:2019-02-12 12:26:28
【问题描述】:

我不明白为什么函数式表达式调用不起作用并引发错误。

你能给我解释一下吗?

var a = function (x) {
  alert(x)
}

(function() {
   a(1);
}());

谢谢大家

任务比我想象的要容易得多

【问题讨论】:

  • ^ 括号的顺序很重要。
  • 这已经没有意义了,故障代码通过添加分号被编辑成一个工作示例......
  • @NinoFiliu 确实,我已将错误放回问题中。
  • @T.J.Crowder 哦,原来如此。算一下,一次性自动分号插入失败,我没注意到 XD
  • 一个非常粗略的经验法则是:如果您要依赖 ASI,任何以 ([ 开头且不属于前面表达式的内容都应该在他们面前有一个;,以避免这种事情。

标签: javascript iife


【解决方案1】:

那是因为 JS 将 IIFE 解析为函数的参数调用,这样做加分号

var a = function (x) {
  alert(x)
};    
(function() {
   a(1);
}());

【讨论】:

  • 有时需要分号。
【解决方案2】:

因为此刻,在你调用函数的地方,分配还没有发生。

var a; // hoisted, value undefined, no function

// later

a = function (x) {
    alert(x);
}(function() {
    a(1);      // a is still no function
}());

或者你需要插入一个分号来分隔赋值和调用,

var a = function(x) {
  console.log(x);
};
(function() {
  a(1);
}());

或带void分开

var a = function(x) {
  console.log(x);
}
void (function() {
  a(1);
}());

【讨论】:

  • 我会编辑清楚地说第一个函数被调用并通过了第二个。
【解决方案3】:

在 IIFE 中定义函数 a 参考 here

(function() {
  function a(x) {
    alert(x)
  }
  a('x')
}());

【讨论】:

  • 在哪里定义 a 并不重要。 IIFE 将首先运行。因为它 a 永远不会存在,直到在其中定义。 developer.mozilla.org/en-US/docs/Glossary/IIFE
  • @AshayMandwarya - 不,这完全不正确。 IIFE 在代码的逐步执行中运行。这大约是它们的一半。 OP 代码中的问题是缺少分号。只需添加它即可解决问题:jsfiddle.net/tjcrowder/ozmr38hj
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2014-08-30
相关资源
最近更新 更多