JS作用域之let和var

由于之前C和JAVA相关语言的学习,对于JS的作用域比较接收,但中间有一个注意点:

 

 

JS中没有块级作用域,只有全局作用域和函数作用域;对于没有块级作用域,比如:

  这里的i就是for中定义的i,如果在函数外,那么就是全局变量了,页面关闭才会销毁。

对于全局作用域和函数作用域:只用记住子域可以访问父域,而父域不能访问子域(全局作用域:参考C、java的全部变量)。

需要注意let关键字:

let定义的变量让其产生了块级作用域。具体效果如下:

可以看到,在for循环外部,i为undefined状态

 

变量声明提升

 

函数声明和变量声明会被解释器“提升”到方法体的最顶部;

而对于变量的初始化并不会提升,例如:

 

let不会出现变量提升的问题,如图:

可以发现,由于var有提升,所以默认var a;这一条语句解释器会将它放在最上面,只会出现undefined的提示,而let没有提升,所以,会直接报错。

再举几个例子:

可以发现,假如fun中如果没有var b的话,那么两次输出都是没问题的,但由于fun中的b出现了提升,导致第一次的输出出现undefined。

这种写法是不对的,记住:如果区块内中存在let或const,那么外部无法访问区块内的let和const变量,该区块对于外部同名的变量也不能访问。暂时性死区(封闭的区域)

 

函数声明提升

类似于变量声明提升,函数也会存在这种情况

这个是牛客网上的一道题,虽然本人在谷歌上测试结果是正常的,输出true,但这样写存在隐患,因为else中的声明会将if的声明覆盖掉(有些浏览器会自动去除这些隐患)。解决方法:

通过函数声明表达式,这样就不会造成覆盖的问题了。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值