<script>
//1.什么是函数:就是保存了一段代码,并取了个名字
function a(){
console.log(111);
}
a();
//2.把调用函数放在函数上面,js的v8引擎会把声明的函数提升到函数调用前面,所以能正常执行
b();
function b(){
console.log(222);
}
//3.如果写了两个相同名字的函数并各自调用后,v8引擎会先把这两个函数声明提前,没有可提前的声明后再调用函数,但是由于后写的函数会覆盖前面的函数,所以最后调用的只有最后一个写的函数
function c(params) {
console.log(333);
}
c();
function c(){
console.log(444);
};
c()
/*
实际执行的函数:
function c(params) {
console.log(333);
}
function c(){
console.log(444);
};
c();
c()
*/
//练习1
d();
function d(){
console.log(555);
}
function d() {
console.log(666);
}
d();
d=function(){
console.log(777);
}
d();
//错误答案:变量先提前,再函数提前,777,666,666
//正确:函数表达式是不会被提升 所以答案是前两个提升 最后一个不提升
//正确答案是666 666 777
/*实际执行代码
function d(){
console.log(555);
}
function d() {
console.log(666);
}
d();
d();
d=function(){
console.log(777);
}
d();
*/
//练习2 如果函数表达式在前,函数声明在后
f=function f(){
console.log(888);
}
f();
function f() {
console.log(999);
}
f();
/*
1. 函数提升,函数调用的代码不会跟着上去
2.前面是函数声明,后面是函数表达式,函数表达式会覆盖函数声明
实际执行的代码:
function f() {
console.log(999);
}
f=function f(){
console.log(888);
}
f();
f();
最终输出的是888 888
*/
/*
练习3:如果一个变量和函数都提前
*/
var a=5;
function a() {
console.log(000);
}
console.log(a);
/*
1.变量会提前,但是提前的是var a,因为这个提前会开辟空间
2.函数也会提前,然后剩下的留在原地
最后执行的实际是:
var a;
function a() {
console.log(000);
}
a=5;
console.log(a);
最终输出:5
*/
//练习4
function e(){};
var e;
console.log(e);
/*
问题:function和var谁先提升?
js作者没说,但是var提升是提升变量但是没值,函数提升是提升函数体,没有调用,所以可以肯定的是提升后如果都是var a或function a,那么这个a就是一个函数,因此可以认为function和var谁提升都没影响因为他们都是一个函数
总结:js实际会执行两次代码,第一次提升变量或函数,第二次是执行提升后的代码
*/
</script>
声明变量提升问题
于 2022-04-28 10:49:05 首次发布