图片授权基于 CC0 协议
变量提升涉及到的知识点很少,可以直接上代码。
var web = \\\'JavaScript\\\';
上面「声明变量 web 并赋值」其实是分两步执行:
var web;//1、先声明变量;
//执行其它代码
web = \\\'JavaScript\\\';//2、在指定的作用域区赋值
所以,就引出一个问题,如果先输出后定义变量会怎样?
console.log(web);//undefined
var web = \\\'JavaScript\\\';//执行赋值
打印变量 web 会输出 undefined 而不是 is not defined ,它的执行逻辑是这样的:
var web;//1、先提升变量
console.log(web);//2、控制台输出:undefined
web = \\\'JavaScript\\\';//3、变量赋值
console.log(web);//4、控制台输出:JavaScript
变量 web 会被提升到最上面;
除了变量提升还有函数提升。
一、函数表达式
webFn();//控制台输出:webFn is not a function
//函数表达式
var webFn = function(){
console.log(\\\'JavaScript\\\')
}
函数表达式和变量提升同理。
二、函数声明
webFn();//控制台输出:JavaScript
//函数声明
function webFn(){
console.log(\\\'JavaScript\\\');
}
上面代码真实的执行逻辑是:
function webFn(){
console.log(\\\'JavaScript\\\');
}
webFn();//JavaScript
函数提升的时候会提升整个函数,提升到最顶部。
那「函数名」和「函数表达式名」相同,如何处理?
//函数声明
function webFn(){
console.log(\\\'JavaScript1\\\');
}
//函数表达式
var webFn = function(){
console.log(\\\'JavaScript2\\\');
}
webFn();//控制台输出:JavaScript2
函数表达式会提前声明函数,但只有执行完后,才会赋值。但「函数声明」会提升到最顶部。
简单总结
-
每个作用域都会进行提升操作。
-
声明本身会被提升,赋值或其他运行逻辑会留在其作用域。
-
函数先被提升,然后才是变量。
-
函数声明会被提升,函数表达式不会被提升。
参考资料:
[1]《你不知道的 JavaScript 上 》
原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34572.html