JS预编译

javascript是一种解释性语言,它执行之前会先进行语法分析,然后是预编译,最后解释执行,而AO链即预编译过程

所有声明的全局变量,全是window属性
如:var a = 123; ==>window.a = 123;(window 即全局);

函数声明

function test(){…}

函数表达式

var test = function (){…}

预编译步骤:

1、创建AO对象(Activation Object)(执行期上下文)

2、找形参和变量声明,把变量名和形参名作为为AO对象属性名,值为undefined

3、把实参值赋给形参

4、在函数体里面找函数声明,值赋予函数体

注意:预编译发生在函数执行的前一刻

例1:


<script>
			function test(a){
				console.log(a); //function a(){}
				var a = 123;
				console.log(a); //123
				function a() {
					
				}
				console.log(b);//undefined
				var b = function b() {
					
				}
				console.log(b); //function b(){}
				function d() {
					
				}
				console.log(d);
			}
			
			test(1);
			/*1、创建AO对象,2、找形参和变量,3、实参赋值给形参,4、找函数体
			 * AO{
			 * 	a: undefined ==> 1, ==> function a(){}
			 * 	b: undefined
			 *  d: function d(){}
			 * }
			 */
		</script>

2、全局预编译,GO对象(全局对象),如果变量未经声明就赋值,那么此变量就为全局对象所有。(GO===window)

预编译步骤:

1、创建GO对象 Global Object

2、找变量声明,值为undefined

3、在函数体里面找函数声明,值赋予函数体

例2:

<script>
			/*1、创建GO对象,2、找变量名,值为undefined,3、找函数体
			 * GO{
			 * 	global: undefined,
			 *  test: function test(a){...}
			 * }
			 */
			global = 123;
			console.log(global); //123
			function test(a){
				console.log(a); //1
				console.log(global); //undefined
				var global = 345;
				console.log(global); //345
				var a = 234;
				console.log(a); //234
			}
			var gloabal;
			console.log(gloabal);//undefined
			test(1);
			/*执行到函数体时,创建AO对象,预编译,如果函数体里面没有使用的变量,则到函数外面去找。
			 * AO{
			 * 	a: 1 
			 * }
			 */
		</script>

例3:

<script>
			/*1、创建GO对象,2、找变量名,值为undefined,3、找函数体
			 * GO{
			 * 	a: undefined, ==> 10
             *  test: function test(){}
			 *  c: 234,
			 * }
			 */
			
			function test(){
				console.log(b); //undefined
				if(a) {
					var b = 100;
					console.log(b);
				}
				console.log(b); //undefined
				c = 234; //没有变量声明,为全局对象
				console.log(c); //234
			}
			var a;
			console.log(a);//undefined
			test();
			/*执行到函数体时,创建AO对象,预编译,如果函数体里面没有使用的变量,则到函数外面去找。
			 * AO{
			 	只要是变量,就是AO对象属性
			 * 	b: undefined, 
			 * }
			 */
			a = 10;
			console.log(a);//10
			console.log(c); //234
		</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值