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);