预编译

js运行三部曲
  • 语法分析
  • 预编译
  • 解释执行
//js是单线程解释性语言,翻译一句执行一句
//语法分析-->通篇扫描看有没有语法错误

//预编译

预编译前奏
1.imply global暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象所有。
  • eg: a = 123;
  • eg: var a = b = 123;
2.一切声明的全局变量,全是window的属性。
  • eg: var a = 123; ===> window.a = 123;
预编译
四部曲
  1. 创建AO对象 (Activation object)(执行期上下文)
  2. 找形参和变量声明,将变量和形参名作为AO的属性名,值为undefined
  3. 将实参值和形参统一
  4. 在函数体里面找函数声明,值赋予函数体

//预编译发生在函数执行的前一刻

function test(a, b) {
	console.log(a);//1
	c = 0;
	var c;
	a = 3;
	b = 2;
	console.log(b);//2
	function b () {}
	function d () {}
	console.log(b);//2
}
test(1);

AO {
	a : 1, 
	b : function b () {},
	c : undefined,
	d : function d () {}
}
function test(a, b) {
	console.log(a);//fn
	console.log(b);//undefined
	var b = 234;
	console.log(b);//234
	a = 123;
	console.log(a);//123
	function a() {}
	var a;
	b = 234;
	var b = function () {}
	console.log(a);//123
	console.log(b);//fn
}
test(1);
//全局执行期上下文,生成一个GO 对象 Global Object
//GO {
//	a : 123,
//}
//GO === window

var a = 123;
function a() {}
console.log(window.a);
console.log(a);

console.log(test);//fn
function test(test) {
	console.log(test);//fn
	var test = 234;
	console.log(test);//234
	function test() {

	}
}
test(1);
var test = 123;
var global = 100;
function fn() {
	console.log(global);//100
}
fn();
global = 100;
function fn() {
	console.log(global);//undefined
	global = 200;
	console.log(global);//200
	var global = 300;
}
fn();
var global;
function test() {
	console.log(b);//undefined
	if(a) {
		var b = 100;
	}
	console.log(b);//undefined
	c = 234;
	console.log(c);//234
}
var a;
test();
a = 10;
console.log(c);//234
function bar() {
	return foo;
	foo = 10;
	function foo() {
	}
	var foo = 11;
}
console.log(bar());//fn

console.log(bar());//11
function bar() {
	foo = 10;
	function foo() {
	}
	var foo = 11;
	return foo;
}
(window.foo || (window.foo = 'bar'));//'bar',先算括号内

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值