js预编译

1. 预编译规则

  • js在页面加载过程中顺序执行。但是分块预编译、执行
  • js在执行前会进行类似"预编译"的操作,而且先编译预声明变量编译预定义函数
    特别注意,是声明,不是定义,如:var a = 1; 在预编译中,只是执行了"var a"没有赋值,即在预编译结束时a 为undefined。
  • 并不是先全文编译完再执行,而是块编译,即一个script块中预编译完就执行,然后(按顺序)下一个script块,预编译后再执行,但此时在上一个块中的数据都是可以用的,但下一个块中的函数,声明的变量都是不可用的。
  • 变量没声明就引用,会报错,但对象方法,对象变量如果没有声明,值是undefined。
  • 在函数中变量不声明就赋值,会被认为是全局变量,用var声明后为函数变量(局部变量)。
  • 在执行函数时也是先编译后执行,但要注意在函数定义中(即大括号中)的代码即使有错只要函数不执行,就不会有影响,但一执行函数,开始函数预编译就会出错。

2. 示例

  • 示例1
	//alert(a);   //变量没声明就引用,会报错
	//alert(b);   //变量没声明就引用,会报错
	fn();
	//alert(a);   //变量没声明就引用,会报错
	alert(b);   //100,在函数fn执行过程中,b被声明为全局变量
	function fn(){
	    var a=b=100;
	}
  • 示例2
	console.log(a);//unfined,预编译是先编译预声明变量再编译预定义函数,在预编译中,只是执行了"var a"没有赋值
	//console.log(b);//变量没声明就引用,会报错
	//fn();//fn不代表函数了,会报错
	var a=function fn(){var a=b=100;}//原函数名fn就不代表函数了,等同于一个匿名函数
	a();
	console.log(a);//function fn(){var a=b=100;}
	console.log(b);//100
  • 示例3 函数中出现同名变量
function bar(){//预编译时把函数声明(foo)提到了前面
   	return foo;
   	foo=100;
   	function foo(){}
   	var foo=11;
}
console.log(bar());	//"	function foo(){}var foo=11;"
console.log(bar());	//11,不会报错是因为预编译时把函数声明(bar)提到了前面
function bar(){
	foo=10;
	function foo(){}
	var foo=11;
	return foo;//同名时局部变量优先于全局变量
}
  • 示例4
    同时使用函数声明、函数表达式定义函数,其位置不同会导致输出结果不同。
    请看这篇博客
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值