函数声明
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 会将这个函数声明转换为内存中的函数对象,并将其放到作用域中。同样,如果解析到了某个变量声明,也会将其放到作用域中,但是会将其值设置为 undefined,表示该变量还未被使用。
变量提升:在编译阶段,将所有的变量提升到作用域的过程
表达式 是不会在编译阶段执行的
在 V8 解析 JavaScript 源码的过程中,如果遇到普通的变量声明,那么便会将其提升到作用域中,并给该变量赋值为 undefined,如果遇到的是函数声明,那么 V8 会在内存中为声明生成函数对象,并将该对象提升到作用域中。
V8 是怎么处理函数表达式的
函数表达式:在一个表达式中使用 function 来定义一个函数