您当前的位置: 首页 >  Java

命运之手

暂无认证

  • 3浏览

    0关注

    747博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Javascript】【作用域】var的作用域,var定义的变量和没有var定义的变量的区别,var和let,const的区别

命运之手 发布时间:2019-04-28 23:03:00 ,浏览量:3

在这里插入图片描述 首先看上图的测试代码,下面我们通过讲解原理来说明为什么会产生这样的结果

?var的作用域有两种,一种是function作用域,一种是window作用域,当我们调用一个js变量时,首先会检查当前function内有没有定义这个变量,如果没有,则一层层查找上层的function,使用上层function中的变量,如果上层function中也没有此变量,最后则使用window作用域中的变量

?js执行时,首先检查有无var定义的变量,如果有,则记录该作用域内有此变量,其初始值为undefined,等到执行语句阶段,在该作用域内,就会使用自己的变量,而不会去外部作用域去查找

?var检查阶段,只记录了每个作用域有哪些变量定义,并不会给变量赋值,即使变量的定义和赋值是在同一行代码,变量的初始化值都是undefined

?在执行语句阶段,如果遇到给未定义的变量赋值的语句,如【v = “window.v”】,则会隐式地为其添加一个var关键字,自动定义这个变量。但是请注意,这个变量的定义,是在执行到对应语句的时候才发生的,并不是在var检查阶段就存在

?【Object.x】语句是获取对象属性,不存在就是undefined,这和直接访问【x】变量有所区别,如果第一行代码改为【alert("V1 " + v)】,则会报错,因为此时v并未定义,不能直接使用

?注意,【alert(x)】语句中,x未定义和x定义了但是尚未赋值是有区别的,前者直接报错,后者弹出undefined

?var只有window和function这两种作用域,var无视括号的存在,let拥有一个比function更小的作用域,即括号作用域,其运行原理和var完全一致

?const和let的作用域一致,但是其值不能被修改,且在定义时就必须赋值

关注
打赏
1654938663
查看更多评论
立即登录/注册

微信扫码登录

0.0393s