自调用函数表达式需用括号包裹使其被解析为表达式而非声明,再加()执行;常见写法为(function(){})(),也可用!、+等一元运算符前置;具名函数表达式支持内部递归调用。
函数表达式实现自调用,核心是让它“一定义就执行”,而不是先赋值再手动调用。关键在于让解析器把它识别为表达式,而非声明语句——否则直接写 function(){}() 会报语法错误。
必须用括号包裹整个函数,使其成为表达式,再加 () 触发执行:
✅ 正确(最常用):
(function() { console.log("我立即执行了");})();
✅ 也正确(函数有名字,但仅内部可用):
(function init() { console.log("初始化完成");})();// init 在外部不可访问,不影响作用域
✅ 带参数的写法:
(function(name, age) { console.log(`你好,${name},${age}岁`);})("张三", 25);
❌ 错误(会被当成函数声明,语法报错):
function() { console.log(1); }(); // Uncaught SyntaxError
JavaScript 解析器看到 function 开头时,默认按函数声明处理,而声明不能紧跟 ()。加上外层括号后,它被强制当作函数表达式,表达式后面接 () 就是合法的调用语法。
这些也能让函数变成表达式,原理类似,只是括号形式不同:
用 !、+、- 等一元运算符前置:
!function() { console.log("用感叹号触发"); }();+function() { console.log("用加号触发"); }();
用数组字面量包装(不推荐,语义不清):
[function() { console.log("数组里执行"); }()];
(function fact(n){...})()),内部用 fact 调自己,比 arguments.callee 更安全可靠。不复杂但容易忽略细节。