JS作用域之let和var

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

 

 

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

JS作用域之let和var_第1张图片  这里的i就是for中定义的i,如果在函数外,那么就是全局变量了,页面关闭才会销毁。

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

需要注意let关键字:

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

JS作用域之let和var_第2张图片JS作用域之let和var_第3张图片

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

 

变量声明提升

 

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

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

JS作用域之let和var_第4张图片

 

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

JS作用域之let和var_第5张图片JS作用域之let和var_第6张图片

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

再举几个例子:

JS作用域之let和var_第7张图片可以发现,假如fun中如果没有var b的话,那么两次输出都是没问题的,但由于fun中的b出现了提升,导致第一次的输出出现undefined。

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

 

函数声明提升

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

JS作用域之let和var_第9张图片

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

JS作用域之let和var_第10张图片

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

你可能感兴趣的:(JS)