js 中,变量的作用域有三种:
- 全局作用域
- 函数作用域
- ES6 新增了块级作用域
全局作用域:
- 没有用 var 声明的变量(除去函数的参数)都具有全局作用域,成为全局变量
- window 的所有属性都具有全局作用域
- 最外层函数体外声明的变量也具有全局作用域
最外层的作用域,具有全局作用域的变量可以被任何函数访问。 这样的坏处就是变量间很容易产生冲突,另外该值被修改时很难定位。
函数作用域: 在函数作用域中定义的变量,在函数外部是无法访问的。
ES6 的块级作用域: 只要用花括号包起来的都属于一个块,在其中定义的所有变量在代码块外都是不可见的,称之为块级作用域
要得到一个变量的值,若当前作用域没有定义,就到父级作用域寻找。如果父级作用域中也没找到,就再向上一层寻找,直到找到全局作用域。这种一层一层的关系,就叫做作用域链。