JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
使用匿名函数的方式不存在函数提升,因为函数名称使用变量表示的,只存在变量提升。
JavaScript只有声明的变量会提升,初始化的不会。
变量的声明和函数的声明提升,提升的时机发生在预解析过程中。
预解析过程也就是创建 AO(Activation Object) 的过程。
原则上变量应该先声明后使用,但是常常忘记声明就使用了变量,这样做js代码在执行的时候不报错,只是返回了一个undefined。这种情况就是变量提升。
计算机执行的时候会把未声明就使用的变量隐式的放到代码的最顶端。需要注意的是变量虽然发生了提升,但是给变量赋的值是不会随之提升的,所以就会得到结果undefined。
什么是函数提升?
与变量提升的意思差不多,先使用函数,后再声明函数,这种违背逻辑的事情在JavaScript中是允许的,这门语言就是这么灵活。
与变量提升不同的是,函数的返回值也会随之提升,所以你会发现在
getData();//会调用方法输出
console.log(str) //会报错 初始化前无法访问“str”
console.log(data) //会报错 初始化前无法访问“data”
console.log(num) // undefined
var num = 10;
let str;
const data;
function getData(){
console.log('方法调用了')
};