【问题标题】:Immediately Invoked Function Expression in javascriptjavascript中立即调用的函数表达式
【发布时间】:2020-02-13 23:15:08
【问题描述】:

javascript中立即调用函数表达式最后加()是什么原因

(function() {
    // Code that runs in your function
})( /* this parenthesis in the end */ )

【问题讨论】:

  • 原因是你的头衔,调用一个无名函数
  • 一个函数调用看起来像referenceToFunction(),所以后面的()是函数被调用的原因。
  • 要...调用表达式。立即地。没有它,它只是一个函数表达式。
  • @user2303712 如果你省略最后的括号它不是 IIFE。它不会立即被调用。 (function(){}) 是一个简单的函数表达式,它定义了一个函数,并且....对它什么都不做,然后在不执行它的情况下将其丢弃。
  • 如果不放 end 括号,就好像把地球上一个全新的荒岛放到了你无法回调的地方,因为你只是设置了匿名函数。

标签: javascript parentheses iife


【解决方案1】:

立即调用函数表达式是:

(function() { ... })函数表达式 立即调用()

详细地说,(function() { ... }) 只是定义函数,一个定义但从未调用过的函数绝对什么都不做。

为了执行函数中的代码,需要调用(通常称为调用函数)。这就是为什么您将函数定义包装在括号中(使其成为计算函数引用的表达式)然后立即调用(或调用)带有任何参数()的函数 - 或否与您的示例中的参数一样。

这或多或少等同于这样做:

const someFunc = (function() { ... }); //merely assigns a function, the code inside doesn't run
someFunc(); //invokes the function (but in this case it isn't immediate)

除非在这种情况下,您已将函数引用绑定到变量,因此它不再是 IIFE。

【讨论】:

  • 值得注意的是,简单的(function() { ... }) 实际上不会做任何你可以观察到的任何事情 - 因为它是一个函数表达式,甚至没有分配给变量或对象属性。就像 (2) 本身在一行代码中不会做任何事情。
  • 非常感谢@Klaycon 提供的详细信息。这是我现在的理解。这是一个函数定义 function() { ... } 如果我想调用这个函数,我必须将它包裹在括号中 ( function() { ... } ) 任何时候你将一些东西包裹在括号中,它就会变成一个表达式,然后如果我想立即调用它,我必须添加另一个括号最后( function() { ... } ) ( )。如果我理解正确,请告诉我。
  • @user2303712 假设您定义了一个函数并将其分配给某个变量,例如:var myFunc = function() { ... };... 代表的代码已经运行了吗?不,你只是定义了一个函数,你还没有调用它。你会写什么来调用上述函数myFunc
  • 但这正是您调用任何函数值的方式。你总是需要在函数值后面加上括号——有时里面有参数,但如果函数不需要参数,则不需要——以便执行它。如果函数作为内联函数表达式给出,则不会改变。
  • @user2303712 没错。您可以通过在左侧编写解析为函数引用(如包含函数的变量)的内容来调用函数,并在右侧的括号中将参数传递给函数。左 - myFunc。对 - ()。 IIFE 也是如此,但左侧是奇怪的圆括号和方括号,因为它是一个函数表达式。
【解决方案2】:

原因纯粹是语法上的。 JavaScript 解析器必须能够轻松地区分函数声明和函数表达式。如果我们省略函数表达式周围的括号,并把我们的直接 作为单独的语句 function(){}(3) 调用,JavaScript 解析器将开始处理它,并得出结论,因为它是一个以关键字 function 开头的单独语句,它正在处理一个函数声明。

因为每个函数声明都必须有一个名称(这里我们没有指定),所以会抛出一个错误。为了避免这种情况,我们将函数表达式放在括号中,向 JavaScript 解析器发出信号,它正在处理一个表达式,而不是一个语句。还有另一种实现相同目标的方法:

  (function(){}(3))

通过将立即函数定义和调用包装在括号中,您还可以通知 JavaScript 解析器它正在处理一个表达式。

这四个表达式是各种 JavaScript 库中常见的立即调用函数表达式的同一主题的变体:

+function(){}();
-function(){}();
!function(){}();
~function(){}();

这一次,我们可以使用一元运算符,而不是在函数表达式周围使用括号将它们与函数声明区分开来:+、-、! , 和 ~ .我们这样做是为了向 JavaScript 引擎发出信号,表明它正在处理表达式而不是语句。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 2018-01-07
    • 2012-09-02
    • 1970-01-01
    • 2023-04-04
    • 2016-05-04
    • 2014-08-10
    • 2012-12-28
    相关资源
    最近更新 更多