预编译:
函数声明整体提升
变量 声明提升
window 就是全局的域
1.imply global 暗示全局变量:即任何变量,如果变量未经声明就赋值,此变量就为全局对象(window)所有。
eg: a = 123;
eg: var a = b = 123;
2.一切声明的全局变量,全是window的属性。
eg:var a = 123; ===> window.a = 123;
console.log(a);
var a = 123; -->undefined
//
console.log(a); 报错 a is not defined(未声明就使用)
//
test(); -->123
function test(){
console.log(123);}
//
function test(){
var a = b =123;}
console.log(b); -->123
console.log(a); -->undefined
//
console.log(a);-->function
function a(){
}
var a = 123;
//
(window.foo || (window.foo = ‘bar))
分析:先执行括号内 foo = ‘bar’
window.foo(bar 不往后执行或运算)
window.foo == ‘bar’
function fn(a){
console.log(a);
var a = 123;
console.log(a);
function a(){}
console.log(a);
var b = function(){}
console.log(b);
}
fn(1);
预编译发生在函数执行的前一刻
四部曲:
- 创建AO对象(Activation Object : 执行期上下文)
AO{
}
2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined
AO{
a : undefined,
b : undefined
}
3.将实参值和形参统一
AO{
a : 1,
b : undefined
}
4.在函数体里面找函数声明,值赋予函数体
AO{
a : function a(){},
b : undefined
}