浅记JavaScriptのvar关键字


变量提升与函数提升

1.var关键字

1.声明赋值

声明变量的方式作用区别
let用于声明变量暂时性死区(块级作用域)
var用于声明变量存在变量提升
const用于声明只读的常量const 声明后不得修改

 

2.JavaScript奇怪现象:

  • 1.函数体内变量在定义之前可被访问到,不报错。
  • 2.函数在定义之前被调用,不报错

 

3.为何会这样?

因为JavaScript中存在一种特殊的变量提升函数提升机制

首先,先了解一下作用域

 

4.作用域

作用域:一个变量的定义与调用在固定的范围中。

分为:

  • 全局作用域
  • 函数(局部)作用域
  • 块级作用域

 

  • 全局作用域

    var 在全局作用域下声明变量,在任何位置都能访问到

     

  • 局部作用域

    var 在局部作用域下声明变量,在任何位置也能访问到

 

  • 全局作用域:任何位置都可以访问
  • 函数(局部)作用域:只能函数内部访问
  • 块级作用域:只能在代码块中访问(ES6新增letconst)

 

5.预解析

1.基本概念

  • 使用var定义的变量时,函数中会存在变量提升的问题

1.代码1

 

2.代码2

  • 代码2中涉及了变量提升

var 定义的变量,在输出时,会优先在函数内部作用域中寻找变量。如果内部没有,则去父级作用下找对应的变量。

  • 执行过程

 

2.变量预解析

如果给 var 声明的变量赋值,声明会被提升到当前作用域的最前面

 

3.函数预解析

如果定义一个函数,函数也会被提升到当前作用域的最前面

 

4.注意点

如果将函数赋值给一个var定义的变量, 那么函数不会被预解析, 只有变量会被预解析

 

5.变量提升

变量提升是将变量的声明提升到函数顶部的位置,而变量的赋值并不会被提升(仅限用于var关键字)

  • 变量未定义var关键字

未使用var关键字的变量是全局变量,不会产生变量提升,直接进行输出,会抛出变量xxoo未定义异常

 

6.函数提升

使用函数声明方式定义的函数也会出现提升

  • xxoo()函数的声明在调用之后,能调用成功,因为xxoo()函数被提升至作用域顶部,相当于下面的代码

函数提升会将整个函数体一起进行提升,包括里面的执行逻辑。

  • 函数表达式不会函数提升

 

 

7.变量提升与函数提升的应用

加深理解

  • 1.关于函数提升

 

  • 2.变量提升和函数提升同时使用

 

  • 3.变量提升和函数提升优先级

 

  • 4.变量提升和函数提升整体应用

注意:

无论变量还是函数,都做到先声明后使用

  • ES5语法

 

  • ES6语法

2.var面试题

 

声明:杂念屋|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 浅记JavaScriptのvar关键字


自觉渺小而读书