写给自己:每天进步一点点啦!!!奥里给!!!
文章目录
- 预解析
- 啥是预解析??
- 变量的预解析
- 函数的预解析
- 函数表达式声明函数问题
- 几个相关小例子(来自网络各大网站收集)
预解析
啥是预解析??
y也没那么深奥,就和表面意思一模一样啦!!!
- 预解析:在当前作用域下,js运行之前,会把带有var和function关键字声明的变量先声明,并在内存中安排好。然后从上至下解析js语句。而且function的声明优先于var声明。
🌂:不过下面这一点很重要
预解析会把变量和函数的声明在代码执行之前执行完成。
变量的预解析
- 预解析还有一种说法叫做变量提升、还有个叫函数提升的东西。
- 变量提升: 变量的声明会被提升到当前作用域的最上面,但是对于变量的赋值却不会随之提升(敲黑板!!!)。
先从简单的东西看起,如下
console.log(num);
var num = 23333;
这个结果说明了啥???变量提升只提升声明,并不会提升赋值
函数的预解析
和变量预解析有一对丢类似的概念, 函数的声明会被提升到当前作用域的最上面,但是不会调用函数(敲黑板!!!)。
fun();
function fun() {
console.log('我是DJDJDJDJ哈哈哈哈哈');
}
函数表达式声明函数问题
看看下面这个例子!!!
fun();
var fun = function() {
console.log('DJDJDJDJ');
}
结果:报错提示 ”fun is not a function"??????
🌂:该段代码执行之前,会做变量声明提升,fun此时值为undefined;而fun调用是在fun被赋值为函数体之前,此时fun的值是undefined,所以无法正确调用,所以不难发现JavaScript魅力真的有点不大一样鸭!!!
几个相关小例子(来自网络各大网站收集)
再补充几个例子,加强我的记忆,奥里给!!!
第一个:
.log(num); // 输出undefined
var num = 10;
上面那个相当于执行了下面的过程!!!是不是突然又觉得自己又可以了!!
var num;
console.log(num);
num = 10;
第二个:
对上面那个讲解一下还是!!!
fun();
var fun = function() {
console.log(23333);
}
相当于是下面的过程:
var fun;
fun();
fun = function() {
onsole.log(22);
}
所以为啥报错显而易见对吧!!!
第三个:
var num = 10;
fun();
function fun() {
console.log(num);
var num = 20;
}
var num = 10;
function fn() {
console.log(num);
var num = 20;
console.log(num);
}
fn();
var num;
function fn() {
var num;
console.log(num);
num = 20;
console.log(num);
}
num = 10;
fn();
相当于是:
var num;
function fun() {
var num;
console.log(num);
num = 20;
}
num = 10;
fun();
第四个:
var a = 18;
f1();
function f1() {
var b = 9;
console.log(a);
console.log(b);
var a = '123';
}
相当于是:
var a;
unction f1() {
var b;
var a;
b = 9;
console.log(a);
console.log(b);
a = '123';
}
a = 18;
f1();
最后一个 :
f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}
相当于是:
function f1() {
var a;
a = b = c = 9;// 相当于 var a = 9; b = 9; c = 9; b 和 c 没有赋值 没有var 声明,当 全局变量看
console.log(a);
console.log(b);
console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);
解释():
- 全局变量在代码的任何位置都可以使用
- 在全局作用域下 var 声明的变量 是全局变量
- 特殊情况下,在函数内不使用 var 声明的变量也是全局变量
参看第三条,b=c=9就相当于是全局变量了!!!所以为啥第二次a会报错!!!