了解什么是预解析

本文详细介绍了JavaScript中的预解析机制,包括变量和函数声明的提升。通过实例解析了预解析如何影响代码执行顺序,特别是对变量作用域和函数声明的理解。同时,探讨了预解析在不同script标签中的处理,以及预解析的经典案例分析,帮助读者深入理解JavaScript的执行机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预解析:提前解析代码之前

预解析做什么事?
变量的声明提前了 ---- 提前到当前所在的作用域的最上面
函数的声明也会被提前 — 提前到当前所在域的最上面

小小的脑袋,大大的疑惑说啥呢???
先举个例子:

console.log(num);//结果为:undefined
var num=10;

如果是从未了解过预解析的,肯定很困惑,为什么是undefined,之前猜想结果可能报错,或者是10。
其实它代码运行过程是这样的:

var num;
console.log(num);
num = 10;

所以结果是undefined,代码变量的声明会提前到作用域的最上面

同理函数的声明也会像这样提前声明到作用域的最上面
举个例子:

//函数调用的时候,会把函数的声明提升到作用域的上面
f1();//调用
var  num = 20;
function f1(){
	console.log(num);//undefined
	var num = 10;
}

代码运行过程:


var  num ;
num = 20;
function f1(){
	var num;
	console.log(num);//undefined
	num = 10;
}
f1();//调用

注意:

  1. 预解析中,变量的提升,只会在当前的作用域中提升,提前到当前的作用域的最上面
  2. 函数中的变量只会提前到函数的作用域的最前面,不会出去
  3. 预解析会分段(多对的script标签中函数重名,预解析的时候不会冲突)
    举个例子:

<script>
function fun2(){
	console.log("哈哈")
}
fun2();//嘎嘎
function fun2(){
	console.log("嘎嘎");
	}
fun2();//嘎嘎
//在同一script中同名函数下面的函数会覆盖上面的函数
</script>



<script>
function fun2(){
	console.log("哈哈")
}
fun2();//哈哈
</script>
<script>
fun2();//嘎嘎
function fun2(){
	console.log("嘎嘎");
	}
</script>

预解析经典案例1:

fun3();
console.log(c);//9
console.log(b);//9
console.log(a);//报错
function fun3(){
	var a = b = c =9;
	console.log(a);//9
	console.log(b);//9
	console.log(c);//9
};

函数里所输出的基本是没有多大问题,可为什么在函数外面输出的a 、b 、c是报错 、9、9呢?把过程写一下或许我们就出来了结果

console.log(c);//9
console.log(b);//9
console.log(a);//报错
	function fun3(){
		var a ;
		a = 9;//局部变量
		b = 9;//隐式全局变量
		c = 9;//隐式全局变量
		console.log(a);//9
		console.log(b);//9
		console.log(c);//9
	};
fun3();

原来b和c是隐式全局变量,所以输出了9,而a属于局部变量,所以在外部不能调用。
不清楚三种变量作用范围的小伙伴请点这里全局变量、局部变量、隐式全局变量

预解析经典案例2:

fun4();//报错
var fun4 = function (){
	console.log(a);
	var a = 10;
}

这道题就是一种假象,不注意很容易错。fun4是var 出来的,变量的声明

var fun4;//变量预先声明
fun4();
fun4 = function (){
	console.log(a);
	var a = 10;
}

fun4()并不能调用,还未声明函数,所以报错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值