MST

星途 面试题库

面试题:JavaScript函数提升与作用域:函数提升在复杂函数定义中的表现

请解释以下代码中函数提升的行为,并说明输出结果。 ```javascript console.log(func()); function func() { return 42; } ``` 另外,如果将代码改为 `console.log(func()); let func = function() { return 42; };`,输出结果又会是什么,为什么?
46.8万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 对于第一段代码
    • 函数提升行为:在JavaScript中,函数声明会被提升到其所在作用域的顶部。这意味着在代码执行之前,函数func已经被声明和定义好了,即使它的定义写在console.log(func());之后。
    • 输出结果:42。因为函数func被提升,console.log(func());调用的是定义为返回42的函数func
  2. 对于第二段代码
    • 函数提升行为:这里使用的是let声明变量funclet有块级作用域且不存在变量提升(虽然有暂时性死区,但这里不涉及块级作用域问题)。console.log(func());执行时,func变量已经在作用域中存在,但还未初始化(因为let声明的变量不会被提升到作用域顶部并初始化)。
    • 输出结果:会报错ReferenceError: func is not defined。因为在执行console.log(func());时,func变量还未初始化,尽管它在后面被赋值为一个函数。