- 在我们正常的工作中很少会遇到这种关于变量、函数的提升问题,但是在我们面试的时候都喜欢问的,真不知道面试官怎么想的,而我们这些菜鸟往往就会在这里出现问题。
- 废话不多说,开始正文
- 首先我们都知道再执行js文件时,会分为两部,编译和执行,变量、函数的提升就在编译的时候完成的
- 记住要点:
- ***提升的是变量名而不是变量值
- ***变量的提升只会对var 声明的变量进行提升
- 1.关于变量的提升
- 类似于 a = 1;的这种编译的时候就会写成
var a;
a = 1
- 2.关于函数的提升
- 分为 函数声明式 和 函数字面量式
- 函数字面量的提升与变量的提升是一样的,顺序的话就是看谁前谁后了
- 函数声明式的提升就不一样了,函数声明式的优先级高于变量的优先级。也就是在提升时,函数声明式 总是在 变量 的前面的——(后半句错误!!!)
下面看具体的例子
1.先看变量的提升
console.log(a) //结果为:a is not defined 报错了
b = 1;
console.log(b) //结果为:1
var c = 2;
console.log(c) //结果为:2
实际以上代码会编译为下面的,然后再从上向下执行
var b;
var c;
console.log(a);
b = 1;
console.log(b);
var c = 2;
console.log(c)
2.函数的提升(函数声明式)
console.log(aa); //结果为 undefined
console.log(bb); // 这个将会报错 bb is not defined 变量的提升只会对var声明的变量进行提升,所以就未定义呗!
bb = 10
var aa = 100;
function fn() {
console.log(aa); //结果为 undefined
var aa = 200;
console.log(aa); //结果为 200
}
fn();
console.log(aa) //结果为 100
实际以上代码会编译为下面的,然后再从上向下执行
var aa;
function fn() {
var aa;
console.log("函数内部的 "+aa); //第二结果 函数内部的 undefined
aa = 200;
console.log("函数内部的 "+aa) //第三个结果 函数内部的 200
}
console.log("变量 "+aa) //第一个结果 变量 undefined
console.log(bb)
bb = 10
aa =100
fn()
console.log("变量 "+aa) //第四个结果 变量 100
当然上面的bb报错了执行不了,测试的时候得注释掉
3.函数的提升(函数字面量式)
fn1(); //报错了 fn1 is not a function
var fn1=function (){
console.log(1)
}
实际以上代码会编译为下面的,然后再从上向下执行
var fn1;
fn1(); //很明显fn1是一个未赋值的变量,并不能用调用函数的方式调用
fn1 = function(){
console.log(1)
}
纠正一个错误:
就是函数提升的优先级比变量提升的优先级高,这句话对着呢,但是他们两之间是变量先提升,函数后提升。那么关于他们的优先级说的是,提升的时间,函数提升的时间比变量提升的时间晚,后执行,所以说是函数提升的优先级高于变量。看下面的列子
function a(){
}
var a;
console.log(typeof a) //结果是 function
如果是函数先提升的话,输出的应该是 undefined