定义方式
- 匿名函数:没有名字的函数,通常定义在表达式中。例如:
const func = function() { console.log('这是匿名函数'); };
这里将匿名函数赋值给变量 func
。
- 命名函数:有明确函数名的函数。例如:
function namedFunction() { console.log('这是命名函数'); }
作用域
- 匿名函数:它的作用域遵循JavaScript的词法作用域规则,取决于它在何处定义。例如在全局作用域定义的匿名函数可以访问全局变量。
let globalVar = '全局变量';
const anonFunc = function() {
console.log(globalVar);
};
anonFunc();
- 命名函数:同样遵循词法作用域规则。不过,命名函数在函数提升方面有特殊表现,它在其所在作用域内可以在声明之前调用。
namedFunction();
function namedFunction() {
console.log('在声明之前调用命名函数');
}
调用方式
- 匿名函数:通常通过将其赋值给变量,然后通过变量来调用,或者作为回调函数直接使用。如前面例子中的
func()
调用。作为回调示例:
setTimeout(function() {
console.log('匿名函数作为回调');
}, 1000);
- 命名函数:直接通过函数名调用,如
namedFunction()
。
内存管理
- 匿名函数:如果匿名函数没有被外部引用,在其执行完毕后,其所占用的内存通常会被垃圾回收机制回收。例如作为立即执行函数(IIFE):
(function() {
let localVar = '局部变量';
console.log(localVar);
})();
// 这里函数执行完后,内部的变量和函数本身没有外部引用,内存可被回收
- 命名函数:只要函数名在作用域内可访问,它所占用的内存就不会被回收。即使函数执行完毕,因为函数名作为引用存在,内存会一直保留,直到该引用被释放。例如在全局作用域定义的命名函数,只要页面不卸载,函数占用内存就不会被回收。