1. 什么是作用域?
通常来讲,一段程序代码中所用到的名字并不总是有效的和可用的,而限定这个名字的的可用性的代码范围就是这个名字的作用域。
2. 作用域分为局部作用域与全局作用域。
2.1 什么是全局作用域?
作用于所有代码执行的环境(整个script标签)或者一个独立的JS文件,任何不在函数内部或者不在大括号中声明的变量,都是在全局作用域下,
2.2 什么是函数作用域?
函数作用域也称为局部作用域,作用于函数内的代码环境就是局部作用域,只能在函数内部访问,不能在函数以外去当问。
2.3 什么是块级作用域?
ES6引入了let和const关键字,和var不同,在大括号中使用let 和 const声明的变量存在于块级作用域中,在大括号之外不能访问这些变量。
3. 根据作用域的不同,变量可以分为全局变量和局部变量。
3.1 什么是全局变量?
函数外部 let 的变量,全局变量可以在任何区域都可以访问和修改。(注意:如果函数内部变量没有声明,直接赋值,也当全局变量)
3.2 什么是局部变量?
函数内部 let 的变量,局部变量只能在当前函数内部访问和修改。(注意:函数参数被认为是当前上下文中的变量,也当局部变量)
4. 变量的访问原则?
只要是代码,就至少有一个作用域;
写在函数内部的局部作用域;
如果函数中还有函数,那么在这个作用域中又可以诞生一个作用域;
访问原则:采取就近与那则的方式来查找变量最终的值,在能够访问到的情况下,先局部,局部没有再找全局。
5 作用域链?
当在javascript中使用一个 变量的时候,首先会尝试在当前作用域下寻找该变量,如果没有找到,再到他的上层作用域链查找,以此类推,直到找到该变量或是已经到了全局作用域,,如果在全局作用域还是找不到,就会在全局范围内隐式声明该变量(非严格模式下)或者直接报错。