素材牛VIP会员
在函数的作用域中,又有传参又有var 新的声明且变量名字一样的时候该以哪一个优先级高?
 13***62  分类:JavaScript  人气:834  回帖:2  发布于6年前 收藏

<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 新的声明且变量名字一样的时候预解析该以哪一个优先级高?

 标签:htmljavascript

讨论这个帖子(2)垃圾回帖将一律封号处理……

Lv5 码农
lo***ge 其它 6年前#1

1、楼上说得不错,先赞一下;
2、这是我在浏览器的一个实例,可以看一下;

3、再上理论——函数内的变量提升!当js进入到新的函数时,函数内所有变量的声明都被提到函数最前面,但是赋值操作还在原地不动。另外很重要的一点是,变量声明是系统根据变量名称进行内存空间分配的,当之前已有某一变量时,你只是单纯地声明而不是赋值的话,它所占内存空间是不变的,也就是说该变量值是不变的!再上一张图,来自于 javascript面向对象编程指南 这本书,可以搜搜看电子版

Lv3 码奴
ba***pc JAVA开发工程师 6年前#2

首先你要明白一个知识点就是变量声明提升,并且变量重复声明并不会影响其值

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
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取