- 预解析的过程
- 代码的执行过程 程序在执行过程,会先将代码读取到内存中检查,会将所有的声明在此时进行标记。所谓的标记就是让js解释器直到有这个名字,后面在使用名字的时候,不会出现未定义的错误,这个标记就是提升 声明:
- 名字的声明,标识符的声明(变量名的提升)
- 名字的声明就是让我的解释器知道有这个名字
- 名字没有任何数据与之对应
- 函数的声明
- 函数声明包含两部分
- 首先告诉解释器函数的名字
- 告诉解释器 这个名字对应的函数体是什么
- 函数声明与函数表达式有区别,函数声明是单独写在一个结构中,不存在任何语句,逻辑判断等结构中 ``` 函数声明: function(){} function f(){}
``` 函数表达式: var f=function(){}; this.sayHello=function(){}; if(true){ function f(){} }
代码分析:
案例1:
var num=1; function num(){ alert(num); } num();
- 预解析过程
- 提升声明 变量num
- 再提升函数 num在内存中已经存在,因此直接绑定对应的函数体
- 内存中有一个函数num
- 执行代码
- 调用num 由于num中存储的是数字1 因此报错
案例2:
var num=123; function foo1(){ console.log(num); var num=456; console.log(num); } foo1();
代码分析:
- 预解析过程
- 执行代码
- 给num赋值为123
- 调用函数
- 进入函数的瞬间预解析,提升变量名num
- 在函数内部是一个独立的空间,允许使用外部的变量即num覆盖外面的num
- 执行第一句 输出为Undefined
- 执行第二句 给num赋值为456
- 执行第三句 输出为456
案例3:
if(true){ function f1(){ console.log('true'); } }else{ function f1(){ console.log('false'); } } f1();
代码分析:
- 预解析过程
- 执行代码
- 执行if语句,条件成立,输出true
- 但是一些老版本在执行过程中,会把If语句中的函数表达式当成函数声明来解析, 并提升函数输出为false*
原标题:变量名提升
关键词: