作用域

  • JavaScript作用域就是代码名字(一般是变量)在某个范围内起作用和效果。
  • 作用:提高了程序逻辑的局部性, 增强了程序的可靠性,减少了名字冲突。
  • JavaScript的作用域分为以下两种:
    (1)全局作用域:在整个script标签或者一个单独的js文件内起作用
    (2)局部作用域(函数作用域):只能在函数内部起效果和作用

全局变量和局部变量

  • 根据作用域的不同,变量可以分为全局变量和局部变量。
    (1)全局变量:在全局作用域下的变量,在全局下都可以使用,包括函数内部。并且,全局变量只有浏览器关闭的时候才会销毁,比较占内存资源。
    (2)局部变量:在局部作用域下的变量,或者说成在函数内部的变量。并且,局部变量在程序执行完毕后就会立即销毁,比较节约内存资源。

注意:
(1)在函数内部没有声明就直接赋值的变量是全局变量
(2)函数的形参可以看作是局部变量

作用域链

  • 作用域链:内部函数访问外部函数的变量,采取的是链式查找的方式来决定取哪个值。(就近原则)
var num = 22;
function fn(){	//外部函数
  var num = 33;
  function fun(){		//内部函数
    console.log(num);
  }
  fun();
}
fn();		//输出结果是:33

拓展(块级作用域)

  • 在ES6之前是没有块作用域的概念,而ES6中新增了块级作用域。
  • 任何一对花括号({})中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。在ES6中只要{}没有和函数结合在一起,那么应该就是“块级作用域”。
  • 块作用域由 { } 包括,if语句和for语句里面的{ }也属于块作用域。
  • 在块级作用域中,var定义的变量是全局变量,let定义的变量是局部变量。而在局部作用域中,无论是用var定义的变量还是用let定义的变量都是局部变量。
  • 无论是在块级作用域还是局部作用域,省略变量前面的var或者let都会变成一个全局变量。