函数声明

foo()
function foo() {
	console.log('foo')
}
// foo

函数表达式

foo()
var foo = function foo() {
	console.log('foo')
}
// VM130:1 Uncaught TypeError: foo is not a function
//  at <anonymous>:1:1

V8 是怎么处理函数声明的

在编译阶段,如果解析到函数声明,那么 V8 会将这个函数声明转换为内存中的函数对象,并将其放到作用域中。同样,如果解析到了某个变量声明,也会将其放到作用域中,但是会将其值设置为 undefined,表示该变量还未被使用。

变量提升:在编译阶段,将所有的变量提升到作用域的过程

表达式 是不会在编译阶段执行的

在 V8 解析 JavaScript 源码的过程中,如果遇到普通的变量声明,那么便会将其提升到作用域中,并给该变量赋值为 undefined,如果遇到的是函数声明,那么 V8 会在内存中为声明生成函数对象,并将该对象提升到作用域中。

V8 是怎么处理函数表达式的

函数表达式:在一个表达式中使用 function 来定义一个函数