ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Javascript 立即调用函数表达式 (IIFE)

2022-11-07 12:53:15  阅读:344  来源: 互联网

标签:函数 定义 运行 JavaScript 代码 java c++ c语言


立即调用的函数表达式或 IIFE 是在定义函数后立即运行的函数。您可能还会看到人们将它们称为匿名函数。它们为我们提供了一种简单的方法来隔离函数中的变量,而不是全局变量 - 之后我们可以轻松地立即运行函数。当顶级不可用时,它们对于运行异步函数也很有用。await

虽然我们通常定义这样的函数:

let x = () => {
    console.log("hello");
}
let y = function() {
    console.log("world");

}

function z() {
    console.log("!");
}

x(); y(); z();

定义 IIFE 意味着在我们编写函数时调用它。因此,我们可以像这样定义IIFE:

(function() {
    console.log("hello world!")
})()

此函数是匿名的(它没有名称) - 它会立即运行。您也可以使用箭头表示法运行它,如下所示:

(() => {
    console.log("hello world!")
})()

虽然上面的IIFE没有名字,但你可以给它们起名字。但是,这并没有真正的意义,因为您无法在其他任何地方调用它们。以这种格式创建并调用函数后,就不能在其他任何地方使用它。这意味着在下面的示例中,尝试调用其他地方将不起作用:myFunction()

(function myFunction() {
    console.log("hello world!")
})()

匿名或立即调用的函数表达式可用于封装异步行为。您仍然可以使用关键字使 IIFE 异步:async

(async () => {
    console.log("hello world!")
})()

在 JavaScript 中为 IIFE 提供参数

我们可以使用预期的格式将变量直接传递到 IIFE 中。例如,下面我们在 IIFE 中有一个参数 - 就是。我们可以使用最后一组括号传入一个值:xx

let getNumber = 10;
(function(x) {
    console.log(x + 10)
})(getNumber) // console logs 20

 The defensive semi colon in IIFEs

You may sometimes see the following code when IIFEs are defined where a semi colon is added to the start.

;(() => {
    return 10;
})

这似乎令人困惑,但它是为了避免一个奇怪的问题,即如果前一行没有分号,函数最后一行将用作函数名称。请考虑以下代码:

let b = 5
let c = 10
let a = b + c
(function () {
    return 10
})();

如果有人忘记加分号,或者您将 IIFE 导入到前一行不包含分号的行上,您可能会遇到一些奇怪的错误。在上面的示例中,你将收到错误。这是因为代码将此解释为尝试运行函数。本质上,代码看到的是:let a = b + cUncaught TypeError: c is not a functionc

c(() => {
    return 10
})()

因此,在 IIFE 开头使用防御分号是避免这种情况的简单方法。

结论

IIFE常见于Javascript代码库中,并且是执行许多操作的有用方法,例如异步代码和作用域变量或特定功能块中的代码。虽然现在在Javascript中还有其他方法可以实现这一点,但你仍然会在任何地方看到这些方法——所以了解它们是如何工作的是很重要的。

标签:函数,定义,运行,JavaScript,代码,java,c++,c语言
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有