在Javascript中,函数及变量的声明都将被提升到函数的最顶部,也就是说我们可以先使用后声明,
但函数表达式和变量表达式只是将函数或者变量的声明提升到函数顶部,函数表达式和变量的初始化将不被提升
var js=function(){} 这种叫做函数表达式 必须先定义后使用
function js(){}这种是函数声明 可以先使用后定义 它会对函数的声明进行一个提升
举个例子
fun();//hello,world哥
function fun(){
console.log("hello,world哥");
}
方法先使用后声明这显然是没有问题的、那么我们接着看函数表达式
var fun=function(){
console.log("本事啦,我的弟");
}
fun();//本事啦,我的弟
显然没有任何问题,我们把声明和使用颠倒位置
fun();
var fun=function(){
console.log("本事啦,我的弟");//Uncaught TypeError: fun is not a function
}
我们发现报错了,但如果我们直接使用fun则会报一个”Uncaught ReferenceError: fun is not defined”的错误(和不声明fun报错是不一样的),其实fun也是一个变量,只不过他是function(){console.log(“本事啦,我的弟”);}的一个引用,fun的声明被提升了,但是初始化没有被提升。
再给大家来一个比较有趣的关于提升的例子
var a=1;
(function(){
console.log(a);
var a=2;
console.log(a);
})();
大家认真的思考一下、打印结果是什么?
正确答案:undefined 2 大家应该想的是1,2 其实这个结果就是变量提升的原因
另一个含ES6的例子:
// try错误会执行catch
try {
oh()
wow()
console.log(oh)
console.log(wow)
} catch (e) {
setTimeout(function () {
console.log(wow)
console.log(oh)
})
}
function oh() {
console.log("更好玩的H5")
}
var wow = function(){
console.log('5555')
}
var oh = "朋友圈疯传的H5传单"
var wow = "凡科微传单"
结果为:
更好玩的H5
凡科微传单
朋友圈疯传的H5传单