由于之前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的声明覆盖掉(有些浏览器会自动去除这些隐患)。解决方法:
通过函数声明表达式,这样就不会造成覆盖的问题了。