为了账号安全,请及时绑定邮箱和手机立即绑定

在函数的作用域中,又有传参又有var 新的声明且变量名字一样的时候该以哪一个优先级高?

在函数的作用域中,又有传参又有var 新的声明且变量名字一样的时候该以哪一个优先级高?

心有法竹 2019-02-28 15:11:51
<script>var a=1function fn1(a){//教程中介绍:此处传参a就相当于在函数中var avar 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 新的声明且变量名字一样的时候预解析该以哪一个优先级高?
查看完整描述

2 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

这是我在浏览器的一个实例,可以看一下;
https://img1.sycdn.imooc.com/5c7a35870001b88403960260.jpg

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

https://img4.sycdn.imooc.com/5c7a35890001f3da08000600.jpg

查看完整回答
反对 回复 2019-03-02
?
慕容森

TA贡献1853条经验 获得超18个赞

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


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


查看完整回答
反对 回复 2019-03-02
  • 2 回答
  • 0 关注
  • 684 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信