自执行函数是在定义的同时立即执行的 JavaScript 函数。为了定义一个自执行函数,你可以将一个匿名函数包裹在一对括号内,紧接着再加一对括号。这些也称为自执行匿名函数。
括号内的匿名函数基本上是一个使用函数表达式定义的函数。因此,自执行函数也称为立即调用的函数表达式(Immediately Invoked Function Expression, IIFE)。
语法
在 JavaScript 中定义自执行函数的语法如下:
(function () {
})();
函数定义被包裹在一对括号内,末尾的第二对括号用于执行该函数。
另一种语法如下:
(function () {
}());
第一种语法更为清晰。
示例
在下面的例子中,我们使用自执行函数在输出中打印消息。
<html>
<body>
<p id="output"> </p>
<script>
(function () {
document.getElementById("output").innerHTML =
"自执行函数被执行!";
}());
</script>
</body>
</html>
输出:
自执行函数被执行!
带参数的自执行函数
你可以创建带有参数的自执行函数并向其传递参数。通常的做法是传递对全局对象(如 window 等)的引用。
(function (paras) {
})(args);
其中 paras
是匿名函数定义中的参数列表,而 args
是传递的参数。
示例
在下面的例子中,我们创建了一个带有一个参数的匿名函数,并向其传递了一个参数。
<html>
<body>
<div id="demo"></div>
<script>
const output = document.getElementById("demo");
(function (name) {
output.innerHTML = `欢迎来到 ${name}`;
})("教程点!");
</script>
</body>
</html>
输出:
欢迎来到 教程点!
自执行函数的私有作用域
无论在自执行函数内部定义了什么代码,都将保持在私有作用域中,并且不会污染全局作用域。因此,开发人员可以使代码更清晰,并消除命名冲突等错误。此外,自执行函数的代码也是隐藏的,无法被其他部分的代码访问。
示例
在下面的例子中,我们在函数外部或内部定义了变量 a
。在外部定义的变量是一个全局变量,而在函数内部定义的变量是一个私有变量,仅限于自执行函数的作用域。
同时,我们在函数内外分别打印了变量的值。用户可以在输出中观察到变量的值。
通过这种方式,我们可以避免命名冲突。
<html>
<body>
<div id="output"> </div>
<script>
const output = document.getElementById("output");
let a = 10;
(function () {
output.innerHTML += "进入函数 <br/>";
var a = 20;
output.innerHTML += "a 的值为 " + a + "<br>";
output.innerHTML += "退出函数 <br/>";
}());
output.innerHTML += "函数外部的 a 的值为 " + a;
</script>
</body>
</html>
输出:
进入函数
a 的值为 20
退出函数
函数外部的 a 的值为 10
示例
在某些情况下,需要在函数外部访问自执行函数内的变量。在这种情况下,可以使用 window
对象将该变量声明为全局变量,如下所示,并在全局作用域中访问该变量。
<html>
<body>
<div id="output"> </div>
<script>
(function () {
var string = "JavaScript";
window.string = string;
})();
document.getElementById("output").innerHTML =
"string 变量的值为: " + string;
</script>
</body>
</html>
输出:
string 变量的值为: JavaScript
自执行函数的私有作用域可以通过使用 call()
或 apply()
方法来访问。
使用自执行函数的好处
-
避免全局作用域 — 开发人员可以使用自执行函数来避免变量和函数的全局作用域,有助于避免命名冲突并使代码更具可读性。
-
-
代码隐私 — 程序员可以避免让自执行函数的代码被其他部分的代码访问。