预编译发生在函数执行的前一刻 (函数)预编译的四部曲: 1.创建 AO 对象 Activation Object(执行期上下文,作用是理解的作用域,函数产生 的执行空间库) 2.找形参和变量声明,将变量和形参名作为 AO 属性名,值为 undefined 相当于 AO{ a : undefined, b : undefined } 3.将实参值和形参统一(把实参值传到形参里) 4.在函数体里面找函数声明,值赋予函数体 (先看自己的 AO,再看全局的 GO)
5.已经声明过的 var , function 提升之后,就不再看. var 提升 都是undefined function 提升是 function(){} var a = function(){}//这种情况,因为不是函数声明,只会提升var 而function不会提升 如果 var 提升和 function 提升时 重名,则function 声明会覆盖 var 声明
//这个过程很重要,编程如果搞不明白执行顺序,就不好弄了. 例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
例 function fn(a){
console.log(a);
var a = 123;
console.log(a);
function a (){}
console.log(a);
var b = function (){}
console.log(b);
function d() {}
}
fn(1);
//答案是 function a(){}//123//123//function (){}
这个系列中,很大一部分内容来自渡一5期的课程. 大家可以先去看渡一js公开课.
全局的预编译三部曲: 1、生成了一个 GO 的对象 Global Object(window 就是 GO) 2、找形参和变量声明,将变量和形参名作为 GO 属性名,值为 undefined 3、在函数体里面找函数声明,值赋予函数体
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
a = 100;
b = 500;
function demo (e) {
function e () {
}
arguments[0] = 2;
console.log(e);//2
if(a){
var b = 123;
function c () {
//if语句中的 var 声明是一定会提升
//if语句当中的function 声明 如果不执行就不会被提升.
}
}
var c;
a = 10;
var a;
console.log(b);//undefined
f = 123;
console.log(c);//undefined
console.log(a);//10
}
var a;
demo(1);
console.log(a);//100
console.log(f);//123
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
a = 100;
b = 500;
function demo (e) {
function e () {
}
arguments[0] = 2;
console.log(e);//2
if(!a){
var b = 123;
function c () {
}
}
var c;
a = 10;
var a;
console.log(b);//undefined
f = 123;
console.log(c);//function c(){}
console.log(a);//10
}
var a;
demo(1);
console.log(a);//100
console.log(f);//123
渡一精英课习题
1
2
3
4
5
6
7
8
9
10
11
var str = false + 1;
console.log(str);//1
var demo = false == 1;
console.log(demo);//false
if (typeof(a) && -true + (+undefined) + '') {
console.log('基础扎实1');//执行,因为 typeof(a) 返回的是"undefined"
}
if(11 + '11' * 2 == 33){
console.log('基础扎实2');//执行
}
!!" " + !!"" - false || console.log('你觉得能打印,你就是猪');//不能打印