大家好,我是31岁的小米,上周,一个准备跳槽的小伙伴找到我,他说:"小米,我昨天面试的时候,面试官问了一个特别奇怪的问题。"我问:"什么问题?"他说:"JavaScript里面,函数声明和函数表达式有什么区别?"他说自己当时回答:"一个是function,一个也是function……"结果面试官笑了笑,没有继续问,出来以后,他越想越难受:"难道不是都一样吗?"我笑了,很多人刚开始学习JavaScript的时候,觉得函数就是函数,无非就是写法不同,可是真正到了项目里,或者到了高级面试,这可是一个高频考点,今天,我们就通过一个故事,把这个知识点彻底搞懂。有一天,王国里来了两位演员假设有一个王国,国王准备举办一场演出。第一位演员叫:函数声明(Function Declaration)第二位演员叫:函数表达式(Function Expression)两个人都会表演,但是进入皇宫的方法,却完全不同。第一位演员——函数声明函数声明长这样:是不是特别熟悉?这里最重要的一点就是function开头,并且后面直接跟函数名,例如:调用:add(1, 2);输出:3是不是很简单?但是它真正厉害的地方,并不是写法,而是它会被提升(Hoisting)。什么叫函数提升?来看代码。很多Java程序员第一次看到这里都会惊讶:"不是还没写函数吗?"为什么可以运行?因为JavaScript在执行之前,会先进行预处理,它相当