You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中函数声明能否赋值给变量?我的代码为何可运行?

函数声明 vs 函数表达式:你的误区解析

首先明确:你最初的核心认知是对的——函数声明不能直接赋值给变量,而函数表达式(包括箭头函数)可以。你混淆的是「具名函数表达式」和「函数声明」的区别。

关键区分:函数声明 vs 函数表达式

判断一个function是声明还是表达式,核心看它所处的上下文:

  • 函数声明:必须作为独立的语句存在,不能是任何表达式的一部分(比如赋值操作的右侧、函数参数、返回值等)。写法示例:
    function square_the_num(num) {
      return num ** 2;
    }
    
    这种声明会被JS引擎提前提升,在代码执行前就可以访问。
  • 函数表达式:只要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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:02:47