首先看一道计算题,你知道他的打印结果吗?
console.log(a);
var a=1;
console.log(a);
getName();
function getName(){
console.log(a)
console.log(b)
a =2
console.log(a)
var b=3
console.log(b)
function b(){}
}
结果为: undefined
1
1
b(){}
2
3
为什么要进行变量提升和函数提升?
JS引擎在读取js代码的过程中,分为两步。第一个步骤是整个js代码的解析读取,第二个步骤是执行。在JS代码执行之前,浏览器的解析器在遇到 var 变量名 和function 整个函数 提升到当前作用域的最前面。
在ES6出来之前,JS并没有块级作用域这一说,只有全局作用域和局部作用域。变量提升指的是使用var声明的变量提升到他所在的作用域的最顶端。
1.变量声明提升
- 通过var定义(声明)的变量, 在定义语句之前就可以访问到
- 值: undefined
2.函数声明提升
- 通过function声明的函数, 在定义之前就可以直接调用
- 值: 函数定义(对象)
3.问题: 变量提升和函数提升是如何产生的?
1.1 变量提升
console.log(a) //undefined
var a='我是Lili'
console.log(a) //'我是Lili'
它的过程就相当于
var a;
console.log(a);
a='我是Lili'
console.log(a)
1.2 函数提升
函数提升只针对具名函数(用function 声明的函数),而对于赋值的匿名函数,并不会存在函数提升。
console.log(a); // f a()
console.log(b); //undefined
function a(){
console.log('hello')
}
var b = function(){
console.log('world')
}
它的过程就相当于:
var a = function (){
console.log('hello')
}
var b;
console.log(a);
console.log(b);
1.3 变量提升与函数提升的优先级
函数提升优先级高于变量提升,且不会被同名变量声明覆盖,但是会被变量赋值后覆盖。而且存在同名函数与同名变量时,优先执行函数。
JavaScript中的函数是一等公民,函数声明的优先级最高,会被提升至当前作用域最顶端。如果前面的函数表达式与之前的函数声明同名,后者会将其覆盖。
比如:
console.log(a) // ƒ a(){} 变量a赋值前打印的都会是函数a
var a=1;
function a(){}
console.log(a) // 1 变量a赋值后打印的都会是变量a的值
首先变量和函数声明都提升,但函数提升优先级高于变量,都提升后变量只是定义没有赋值,所以输出的是函数a。详细过程如下:
function a(){} // 函数声明提升 a-> f a (){}
var a; // 变量提升
console.log(a) // 此时变量a只是声明没有赋值所以不会覆盖函数a --> 输出函数a f a (){}
a=1; //变量赋值
console.log(a) // 此时变量a赋值了 --> 输出变量a的值 1
总结:由于函数声明和变量都会提升,如果函数与变量同名,那么只要在变量赋值前打印的都会是函数,在变量赋值之后打印都是变量的值。
通过讲解现在看一下最上面的那道题的答案,现在明白为啥是那个结果了吗?欢迎探讨
标签:console,log,提升,var,变量,函数 From: https://blog.csdn.net/wuhhongjing88/article/details/143698283