<script>
var a=1
function fn1(a){//教程中介绍:此处传参a就相当于在函数中var a
var a=3+a//问题1:此处重新var a是吧传参处声明的a重新清空并覆盖掉吗?问题2:对于传参处声明的var a和此处声明的var a有声明区别吗,它们两者的关系,和js解读的逻辑请详细讲解下。
alert(a)
var a=8//问题3:此处重新var a是吧传参处声明的a重新清空并覆盖掉吗?还是前面的var a=3+a,a重新清空并覆盖掉吗?
alert(a)
}
fn1(4);
alert(a)
</script>
问题1:此处重新var a是吧传参处声明的a重新清空并覆盖掉吗?
问题2:对于传参处声明的var a和此处声明的var a有声明区别吗,它们两者的关系,和js解读的逻辑请详细讲解下。
问题3:此处重新var a是吧传参处声明的a重新清空并覆盖掉吗?还是前面的var a=3+aa重新清空并覆盖掉吗?
问题4:在函数的作用域中,又有传参又有var 新的声明且变量名字一样的时候预解析该以哪一个优先级高?
首先你要明白一个知识点就是变量声明提升,并且变量重复声明并不会影响其值
var a = 1;
console.log(a);//1
var a = 2;
console.log(a);//2
var a = a+4;
console.log(a);//6
上面等价下面
var a,a,a;//声明提升
//下面的都是赋值操作
a = 1;
console.log(a);//1
a = 2;
console.log(a);//2
a = a+4;
console.log(a);//6
从上面看 声明过的变量 重新声明是没有意义的,所以就不存在声明变量谁覆盖谁,因为只要有一个声明就够了(同一个作用域)
你的代码就变成下面的了
var a;//声明提前
a = 1;//全局变量
function fn1(a) {
//重复声明没有意义所以直接省略(同一个作用域)
//下面都是简单的赋值操作不用说了
a = 3 + a;
console.log(a);//7
a = 8;
console.log(a);//8
}
fn1(4);
alert(a);//函数内声明的变量是局部的并不会影响全局变量 所以这里是a=1