JavaScript中函数声明能否赋值给变量?我的代码为何可运行?
函数声明 vs 函数表达式:你的误区解析
首先明确:你最初的核心认知是对的——函数声明不能直接赋值给变量,而函数表达式(包括箭头函数)可以。你混淆的是「具名函数表达式」和「函数声明」的区别。
关键区分:函数声明 vs 函数表达式
判断一个function是声明还是表达式,核心看它所处的上下文:
- 函数声明:必须作为独立的语句存在,不能是任何表达式的一部分(比如赋值操作的右侧、函数参数、返回值等)。写法示例:
这种声明会被JS引擎提前提升,在代码执行前就可以访问。function square_the_num(num) { return num ** 2; } - 函数表达式:只要
function出现在表达式语境中(比如赋值给变量、作为参数传递),不管有没有名字,都属于函数表达式。你写的这段代码:
就是具名函数表达式,属于函数表达式的一种,不是函数声明。const square_a_num = function square_the_num(num){ return num**2 }
具名函数表达式的特点
和你认为的匿名函数表达式(无函数名的写法)相比,具名函数表达式多了一个内部可用的函数名:
- 这个名字(
square_the_num)只能在函数内部访问,外部无法直接调用; - 适合递归场景,即使外部变量名被修改,内部仍能通过这个名字引用自身。
比如你尝试在外部调用square_the_num()会直接报错,因为它只存在于函数作用域内,而square_a_num是指向这个函数的外部变量。
总结你的误区
你误以为带名字的function赋值是函数声明,但实际上只要是赋值给变量的function(无论是否具名)都是函数表达式。函数声明是独立的语句,不能直接出现在赋值操作的右侧。
内容的提问来源于stack exchange,提问作者Akash Singh
相关产品推荐
相关产品推荐

