匿名函数自调用
看源码的时候经常出现函数名前加!的自调用形式,其中的逻辑究竟是什么呢?
一、函数声明
函数声明是 JavaScript 中定义函数的一种方式,它允许我们定义一个命名函数并在程序中其他地方调用这个函数。
// 函数声明
function sayHello() {
console.log("Hello, World!");
}
二、函数表达式(Function Expression)
函数表达式是将一个函数赋值给一个变量或常量。函数表达式通常是匿名的,也可以是命名的。
匿名函数表达式
// 匿名函数表达式
const sayHello = function() {
console.log("Hello, World!");
};
sayHello(); // 输出:Hello, World!
具名函数表达式
const greet = function greeting() {
console.log("Hello!");
// 你可以在函数内部使用函数名递归调用自己
// greeting();
};
greet(); // 输出:Hello!
三、函数调用(Function Invocation)
函数调用是指执行一个已经定义好的函数。函数调用的方式取决于函数的定义类型(声明或表达式)以及调用时的上下文。
具名函数调用
// 函数声明
function sayHello() {
console.log("Hello, World!");
}
// 可以在函数声明之前调用它(由于函数声明提升)
sayHello(); // 输出:Hello, World!
匿名函数调用
添加括号来调用匿名函数:
(function () {
console.log('success');
})();//success
(function () {
console.log('success');
})();//success
()让一个函数声明语句变成了一个表达式
所以,只要能让一个函数声明语句变成了一个表达式,匿名函数便被解析器正确识别。那么以下方式也都是可以的:
var i = (function () {
console.log('success');
})(); // success
1 &&
(function () {
console.log('success');
})(); // success
1,
(function () {
console.log('success');
})(); // success
!(function () {
console.log('success');
})();