今天发现了一个很有意思的情况,就是我定义一个未赋值的变量,然后在控制台输出,结果是undefined,
然后我在控制台输出语句代码的下一行去进行定义并且赋值一个值,输出结果竟然也是undefined,吼吼,舒服了舒服了
然后就去网上看了一下,就了解到了预解析这个名词。
预解析这个名词听上去好像很难一样,但是其实他并不是很难,下面我带大家了解一下我对预解析的理解。
好啦,废话不多说,直接上代码
console.log(Number); // not defined
var Number;
console.log(Number); // undefined
console.log(Number); // undefined
var Number = 10;
结合上面这几个案例,我们发现Number的声明代码在使用这个变量的代码之后,但是输出却不是not defined !!!
同样,预解析在函数里也出现了类似的情况
func1(); // 控制台输出:哈哈,好像真的不是很难哦
function func1(){
console.log('哈哈,好像真的不是很难哦');
};
func1();
function func1(){
console.log(number); // undefined
var number=10;
};
console.log(number); //not defined
从这个例子中可以看出,在函数中,因为预解析把number变量的声明提前了,所以函数中的输出为undefined, 而下面这个报错就说明预解析虽然把number变量提前了,但是没有提前到函数声明前,所以下面控制台输出的是 not defined
重点:这里有一点需要注意的就是如果在函数内外都定义了一个同名的变量,在函数里调用这个同名变量,
这个时候函数内部会优先使用内部的变量(正所谓近水楼台先得月), 如果函数内部没有找到需要使用的变量的定义和赋值,就会往
全局变量里找,如果都没找到,报错 :not defined (这个原理就类似于预解析链的原理,如果在当前作用域中没有找到需要使用的
变量的定义和赋值,他就会自动去上一级作用域里找,如果一直到了最外面的作用域里还是没有找到,那找了这么久都没有找到,
他心情肯定就会不太好哇,他心情一不好然后就报错了😢)
到了这我们继续看一下下面这段代码然后猜一下最终的结果
func();
var func = function(){
console.log('你好哇,很高兴遇见你');
};
控制台输出:func is not a function ,嗯????我的天哪,这到底是什么情况,咋和我想的有亿点不一样啊,打印一下 func ,看看他到底是啥💢
var func = function(){
console.log('你好哇,很高兴遇见你');
};
console.log(typeof func);
console.log(func);
结果:
function
// 我是控制台的分界线哇,不用太在意我
ƒ (){
console.log('你好哇,很高兴遇见你');
}
哦~~,原来他本身是函数的代码,并不是函数,所以声明不会提前啊~😄
好啦好啦,终于到了最后时刻啦,咳咳(敲黑板),下面进行总结时刻:
预解析:
预解析 (简单来说就是提前解析代码) 只会提升声明,不会赋值
- 变量的提升,只会在当前作用域提升,提升到当前作用域最上面
- 函数中的变量提升,只会提前到函数的作用域中的最前面,不会出去
- 提升的顺序是 先提升 var (变量),再提升function(函数)
注意:赋值式函数不会有预解析的情况,要先声明然后才能使用 !!!
OK,这篇文章到这就结束啦,有什么不懂的或是文章有哪里不对的都可以在评论区指出来哦❤️
bye~🙋♂