AO链作用域链和GO对象

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

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

函数声明

function test(){...}

函数表达式

var test = function (){...}

预编译步骤:

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

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

3、把实参值赋给形参

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

扫描二维码关注公众号,回复: 4929783 查看本文章

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

例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>

猜你喜欢

转载自blog.csdn.net/LLL_liuhui/article/details/85220867
今日推荐