作用域,变量的作用范围

在ES6之前

变量的声明

  只有var可以声明变量属于某个作用域,并且,也只有全局作用域和函数作用域。(没有var声明的变量,属于全局作用域,在全局作用域里声明的变量,函数会成为全局的属性)

  所有的变量,不是全局作用域的,就是函数作用域的。

  如果用var 声明变量,并且是在函数中,那么这个变量就属于这个函数,否则,属于全局变量。

 

提升

  在JavaScript的任何一个作用域中,都存在提升;

        对于一个声明var  a=2;引擎主要会分两步走,var a;   a=2;  JS引擎进行处理和执行。

       所谓的处理,引擎首先会进行全局的扫描,遇到变量的声明(var 声明的变量)就会记录,遇到函数声明(function 关键字开头)也会进行记录,直到全局扫描完毕。然后,引擎开始从头执行,对变量进行修改,对函数进行调用。

      上边所谓的记录,就是提升行为。(如果学过C语言,就知道,函数,变量都要先定义,在使用,否则会报错,但是,js提升,可以理解为,不管你定义在哪里,都会被提升到使用的前面,也就是可以把使用写在定义前面)

      引擎会把声明的变量,函数声明记录到全局的作用域,记录有哪些变量存在,并对变量进行初始化赋值,undefined;为什么是记录到全局,而不是对应作用域,主要是因为,一开始扫描,就是扫描全局作用域,它只扫描一级, 它不会深入扫描,只扫描表面。这个其实很好理解,除了变量的提升,还有函数声明的提升,遇到function 关键字,js引擎只是简单的将其提升到最顶层,在全局作用域中定义的函数,它作用域就相当于二级,js引擎是不会在这个时候去扫描函数作用域的。

  例如:

网友评论