MST
星途 面试题库

面试题:JavaScript中匿名函数与命名函数的区别

请详细阐述JavaScript中匿名函数与命名函数在定义方式、作用域、调用方式以及内存管理方面的主要区别,并各举一个简单示例说明。
49.7万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试

定义方式

  • 匿名函数:没有名字的函数,通常定义在表达式中。例如: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); 
})(); 
// 这里函数执行完后,内部的变量和函数本身没有外部引用,内存可被回收
  • 命名函数:只要函数名在作用域内可访问,它所占用的内存就不会被回收。即使函数执行完毕,因为函数名作为引用存在,内存会一直保留,直到该引用被释放。例如在全局作用域定义的命名函数,只要页面不卸载,函数占用内存就不会被回收。