1、创建函数的方法
<!--函数声明-->
function func1(){
}
<!--函数表达式-->
var func2 = function(){
}
<!--函数对象的声明-->
var func3 = new Function()
2、函数声明提升
func1();
function func1(){
}
func2(); // Uncaught TypeError: func2 is not a function
var func2 = function(){
}
func3(); // Uncaught TypeError: func2 is not a function
var func3 = new Function()
从代码中,可以看出函数声明func1没有报错,但是func2、func3的执行会报错, 说明函数声明会被提升到作用域顶部,但函数表达式、函数对象声明不会。
3、变量声明提升(只有var声明的变量才有变量提升,let、const无;变量赋值无提升)
console.log(a) // undefined
console.log(b) // Uncaught ReferenceError: Cannot access 'b' before initialization
console.log(c) // Uncaught ReferenceError: Cannot access 'c' before initialization
var a = 1;
const b = 2;
let c = 3;
4、两种情况的优先级(函数声明优先于变量声明提升)
例子1:
var func = 10
console.log(func , typeof(func)) // 10 number
function func () {
}
实际提升结果如下:
function func() {
}
var func;
func = 10;
例子2:
num = 10
function func () {
window.num = 5
console.log(num)
var num
console.log(window.num)
}
func() // undefined 5
实际提升结果如下:
function func(){
var num
window.num = 5
console.log(num)
console.log(window.num)
}
var num
num = 10
func()
首先第一个console会在当前作用域中寻找num,因为变量声明提升所以为函数内的num,即undfined,外部的num则是一个全局变量,并且赋值为10