共计 1446 个字符,预计需要花费 4 分钟才能阅读完成。
变量提升和函数提升基本上是面试必问题目
// 先从一个面试题说起
console.log(a)
if (a) {
var a = 1;
console.log(a)
}
function a() {
console.log(this);
}
console.log(a);
a()
下面我们针对这个栗子解析一下
我们知道变量和很熟定义都会提升到作用域最前边
唯一需要确认的是变量和函数的先后顺序
我们预想 函数是用第一公民会不会提升到最前边呢?
// 如果是解析完顺序是这样的
function a() {
console.log(this);
}
var a;
console.log(a)
if (a) {
a = 1;
console.log(a)
}
console.log(a);
a()
按照我们预想的解析结果应该是
// undefined// undefined// 报错
理由 函数在上 var 在下,第一个 console 时 a 未赋值,其结果是 undefined,if 为 false 只剩最后一个 console 也是 undefined 最后 a is not a function.
不过结果是
我机智的认为 预想错了?
// 再次测试
var a;
function a() {
console.log(this);
}
console.log(a)
if (a) {
a = 1;
console.log(a)
}
console.log(a);
a()
这样?对比一下结果人工解析结果:1、a()2、13、14、a() 报错
浏览器执行结果:没毛病!
看到这里一切完美,不过我还是重新搜索了一些高质量文章,发现我错了,虽然执行结果是对的,不过浏览器和人工解析还是不一样的,和我们最开始预想的一样,函数优先。
既然标题说到了 变量 和 函数,我们就一块来说说
// 简单的栗子
function a(){ console.log(a) }
console.log(a)
var a = 1
a()
首先上边已经说到我们预想和认为的是错的。
正确解析顺序是这样的
function a(){ console.log(a) }
var a;
console.log(a)
a = 1
a()
但是,这个但是很重要浏览器执行结果是:why?这就要讲讲我所了解到的原理。
同名变量和函数,函数会提升到最前边,变量其次,为什么不那为什么结果不是我们人工执行的 undefined 呢?原因是 变量会被忽略,是的是忽略。。。
function a(){ console.log(a) }
var a;// 忽略
console.log(a) // 打印函数本身
a = 1
a()// a is not a function
完美!
还有呢?是的还有同名变量是怎样的顺序,同名函数是怎样的顺序。
同名变量
console.log(a)
var a = 1
console.log(a)
var a = 2
console.log(a)
// 解析完顺序是这样的
var a;
var a; // 忽略
console.log(a) // undfined
a = 1
console.log(a) //1
a = 2
console.log(a)//2
* 同名变量,声明会被提升,后边会忽略。
同名函数
function a(){console.log(1)}
console.log(a)
function a(){console.log(2)}
console.log(a)
a()
// 解析完
function a(){console.log(1)}
function a(){console.log(2)}
console.log(a)
console.log(a)
a()
执行结果
我想你已经猜到了,同名函数会被覆盖。
终于完了!
您的点赞是我继续下去的动力,谢谢!