预编译(解决执行顺序问题)

"Hello World, Hello Blog"

Posted by wudimingwo on December 15, 2018

预编译发生在函数执行的前一刻 (函数)预编译的四部曲: 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('你觉得能打印,你就是猪');//不能打印