一.概述

1.JavaScript作用域:就是代码名字(变量)在某个范围内起作用和效果

2.作用域目的是提高程序可靠性,减少命名冲突

二.作用域

1.分类:全局作用域和局部作用域

2.全局作用域:整个script标签或者一个单独的js文件

3.局部作用域(函数作用域):在函数内部就是局部作用域

  • 函数作用域会在调用函数时创建
  • 每调用一次就会创建一个新的作用域,他们之间相互独立
  • 在函数作用域中可以访问全局作用域的变量;而在全局作用域内无法访问函数作用域内的变量

    三.变量的作用域

    1.分类:全局变量和局部变量

    2.全局变量:在全局作用域下的变量

    (1)在函数内部没有声明,而是直接赋值的变量也是全局变量

    3.局部变量:在局部作用域下的变量

    (1)函数的形参也是局部变量

    4.区别(在执行效率上看):

    (1)全局变量再关闭浏览器时销毁,比较占内存;局部变量在程序执行完毕就会销毁,比较节约内存

    5.es6新增块级作用域:就是{}里

    (1)js中没有块级作用域,是在es6中新增的

    四.作用域链

    1.只要是代码,就至少有一个作用域

    2.函数内加一个函数,就是多了一个作用域

    3.内部函数访问外部函数的变量,采取链式查找来决定取哪个值,这种结构称为作用域链

    4.作用域链采取就近原则 上级有该变量就用该变量 若没有就在往上一级

    五.预解析

    1.js代码由浏览器中的JavaScript解析器来执行,JavaScript解析器运行代码时会分以下两步:

    (1)预解析:js引擎会把js里所有的var和function提升到当前作用域的最前面
    (2)代码执行:按照代码的书写顺序从上到下执行

    2.预解析:

    (1)变量预解析(变量提升):就是把所有的变量声明提升到当前作用域的最前面(不提升赋值)
    (2)函数预解析(函数提升):就是把所有的函数声明提升到当前作用域的最前面(不提升调用)