GO: global object 即 全局上下文
AO :activation object 活跃对象,函数上下文,在函数执行之前进行的一个步骤
代码编译过程:
1.检查通篇的语法错误,若有错误则不编译执行
2.预编译
3.解释一行,执行一行
提升:函数声明会整体提升,变量表达式只有声明提升,赋值不提升,如下:
console.log(a); // 输出 a的函数声明 function a() { var a = 0; var a = function() {} } var a = 1;
暗示全局变量:imply global variable
即变量为声明就赋值属于全局变量,一切全局变量都在window下面,在函数内部的变量,未声明就直接赋值,也是全局变量
function test() { var jj = dd = 1; } test4(); console.log(jj) //Uncaught ReferenceError: jj is not defined console.log(dd) // 1
说明 jj是函数内的局部变量,而dd是全局变量
寻找GO的方法:
1. 找变量
2. 找函数声明
3. 执行
var a = 1; function a() { console.log(a) }; console.log(a); //1
console.log(a, b); // a输出function a函数,b 是 undefined。a是函数声明,会整体提升,b是函数表达式,只有声明提升 function a() {}; var b = function() {};
预编译:在函数执行之前进行的一个步骤即AO activation object 活跃对象,函数上下文
寻找AO的方法:
1. 寻找函数的形参和变量声明
2. 把实参的值赋值给形参
3. 寻找函数声明,并赋值
4. 执行
function test(a) { console.log(a); // function a() {} var a = 1; console.log(a); // 1 function a() {}; console.log(a); // 1 var b = function() {}; console.log(b); // function() {} function d() {} } test(2);
AO的过程如下:
AO = {
a: (寻找函数的形参和变量声明)undefined ->(把实参的值赋值给形参)2 -> (寻找函数体声明,并赋值)function a() {} -> (执行) 1
b: (寻找函数的形参和变量声明)undefined -> (执行)function() {}
d: (寻找函数体声明,并赋值)function d() {}
}
作业题:
function test(a, b) { console.log(a); c = 0; var c; a = 5; b = 6; console.log(b); function b() {}; function d() {}; console.log(b); }test(1)
函数内部和外面有相同的变量,如果函数内在变量赋值之前,如果函数内部有变量声明则用函数内部的变量声明,没有则用外面的同名变量
a = 1; function test() { console.log(a); // undefined a = 2; console.log(a); // 2 var a = 3; console.log(a); // 3 } test(); var a;
a = 1; function test() { console.log(a); // 1 a = 2; console.log(a); // 2 a = 3; console.log(a); // 3 } test(); var a;
function test() { return a; // function a() {} a = 1; function a() {}; var a = 2; } console.log(test())
function test() { a = 1; function a() {}; var a = 2; return a; // 2 } console.log(test());
a = 1; function test(e) { function e() {}; arguments[0] = 2; console.log(e); // 2 if(a) { var b = 3; } var c; a = 4; var a; console.log(b); // undefined f = 5; // 全局变量 console.log(c); // undefined console.log(a); // 4 } var a; test(1);