预编译

289 阅读4分钟

预编译

  • 语法分析 通篇扫面但是不执行
  • 预编译
  • 解释代码
可以函数先执行 ,再定义,由于预编译

函数声明整体提升

变量 声明提升

由于预编译:eg:

  • 预编译1.1 函数声明整体提升

        <script type="text/javascript">
      	test();
      	function test(){
      		console.log('a')
      	}
      	</script>
      	//a
    
  • 预编译1.2

       <script type="text/javascript">
     	function test(){
     		console.log('a')
     	}
     	test();
     	</script>
     	//a
    
  • 预编译1.3

    <script type="text/javascript">
        var abc =123;
        console.log(abc)
    
    //123
  • 预编译1.4 变量 声明提升

      <script type="text/javascript">
    	 console.log(abc)
    	 var abc =123;
      </script>
    //undefined
    
  • 预编译1.5

        <script type="text/javascript">
      	 console.log(abc) 
        </script>
      //报错
    

暗示全局变量 imply global window所有

		a =123
		console.log(a)
		//123

在全局上 var 声明的变量也归window所有 window是全局的域

	window{
	    a:123
	}
	var a = 123;
	//二者一致
  • a是全局对象所有window

     	window.a=10
     	// 发个文window.a 结果为10
     	//直接访问a等于10
       <script type="text/javascript">			
     	 function test(){
     		 var a=b=123;				 
     	 }
     	 test();
     	 //window.a-----undefined
     	 //window.b-----123 
          //a是局部, b是全局
         </script>
    
  • window就是全局

      <script type="text/javascript">			
      	  var a=123; 
      	 //window.a-----123
      </script>
    
  •   <script type="text/javascript">			
      	  var a=123; 
      	  var b=123; 
      	  var c=123; 
      	  window{
      		  a:123,
      		  b:123,
      		  c:123
      	  }
      </script>    
         //访问a就是全局的a
    

在全局上预编译过程

      <script type="text/javascript">
		function fn(a) {
			console.log(a) //1
			var a = 123;
			console.log(a) //123
			function a() {}
			console.log(a);
			var b = function() {}
			console.log(b);
			function d() {}
		}
		fn(1)
	
	</script>
// 预编译发生在函数执行的前一刻
  • 1.创建ao对象 (活跃对象,执行期上下文)

  • 2.函数里面的形参和变量声明

  • 3.AO的赋值

         AO{
     	a:undefined
      	b:undefined
     	 }
    
  • 4.将实参与形参变量相统一,赋值有的就不用再写了

  • 5.函数体里找函数声明 有的不用再写了 函数体

           <script type="text/javascript">
		function fn(a) {
			console.log(a) //function a(){}
			var a = 123;
			console.log(a) //123 
			function a() {}
			console.log(a);//123
			var b = function() {}
			console.log(b);//function(){}
			function d() {}
		}
		fn(1)			 
	</script>
	 AO {
	  	a: undefined,
	 	b: undefined,
	   	d: function d(){}
	  }  
	 AO{
		a:123,
		b:function(){}
		d:function(){}
    	} 

eg:

	<script type="text/javascript">
		function test(a,b) {
			console.log(a) //1
			c = 0;
			var c;
			a = 3;
			b = 2;				
			console.log(b) //2
			function b() {} 
			function d() {}
			document.write(b)//2   由于已经提升了 不需要再是函数了
		}
		test(1)			 
	</script>
	<!-- AO{
		a: 3,
		c:0,
		b:function a(){},
		d:function d(){}
	} -->
  • 形参和变量声明 a,b,c 都是undefined

  • 实参形参相统一 a = 1

  • .函数体里找函数声明 b d 变为函数体

  • 函数权限最高

        <script type="text/javascript">
     	function test(a, b) {
     		console.log(a) // function a(){} 
     		console.log(b)//undefined
     		var b = 234;
     		console.log(b)//234
     		a = 123;
     		console.log(a)//123
     		function a() {}
     		var a;
     		b = 234;
     		var b = function() {};
     		console.log(a)//123
     		console.log(b) //function (){} 
     	}
     	test(1)
     </script
    
  • 形参和变量声明 a,b 都是undefined

  • 实参形参相统一 a = 1

  • .函数体里找函数声明 a function a(){} 变为函数体

  • 函数权限最高

  • var b = function() {};是函数表达式,在函数体位置值不会改变,只有最后会赋值

  • GO===window

  • window.a===a

  • 任何全局变量都是window所有

  • go和ao的区别,先发生go

  • 全局的go要发生在执行前一刻

  • go与ao都有用ao的

全局go与ao 1

      <script type="text/javascript">
		// 全局时使用
		// Go{
		// 	test: function test() {......函数体}  
		// }
		console.log(test)// function test(test) {......函数体}  
		function test(test) {
			console.log(test)// function test() {} ao的 
			var test = 234;
			console.log(test); //234 
			function test() {} 
		}
		test(1)
		var test=123
	</script>
	<!-- 变量提升之后就不看了,直接看执行函数前一刻是ao -->
	AO{
	test: function test() {}  
	}

go 与ao执行顺序 2

 	<script type="text/javascript">
		1. go {
			global: undefined,
			fn: fn() { ....
			}
		}
		2. 执行go
		go {
			global: 100,
			fn: fn() { ....
			}
		}
		3.执行函数fn()
		只有console.log
		ao{
			 global:100//go中找到的
		}
		
		var global = 100
		function fn() {
			console.log(global)
		}
		fn();
	</script>
	<!-- 全局变量go也要执行,变量提升之后就不看了,直接看执行函数前一刻是ao -->

go 与ao执行顺序 3

  <script type="text/javascript">
     global = 100;
	 function fn(){
		 console.log(global)//undefined
		 global = 200;
		 console.log(global);//200
		 var global =300;
	 }
	 fn();
	 var global;
	 1.go{
		 global:undefined,
		 fn:function fn () {
		 	....
		 }
	 }
	 2.go{
		 global:100,
		 fn:function fn () {
		 	....
		 }
	 }
	 3.ao{
		 global:undefined
	 }
	</script>

go 与ao执行顺序 4

         <script type="text/javascript">
		function test() {
			console.log(b) //undefined
			global = 200;
			if (a) { //undefined
				var b = 100; //不执行
			}
			console.log(b) //undefined
			c = 234;
			console.log(c);
		}
		var a;
		test();
		a = 10;
		console.log(c)c:234//234//234
		1. go {
			a: undefined,
			test: function test() { ....
			},
			c:234
		}
		2. 执行函数 不管有没有if都会预编译
		ao {
			b: 100,
		}

go 与ao执行顺序 5

      	<script type="text/javascript">
		function bar() {
			 return foo;
			 foo = 10;
			 function foo (){}
			 var foo = 11;
		}			 
		console.log(bar()); // function foo (){}
		1. go {				 
			bar: function bar() { ....
			}
		}
		2. 执行函数 不管有没有if都会预编译
		 ao {
			foo: function foo (){},
		}
	</script>
	<script type="text/javascript">
		console.log(bar());//11
		function bar() {				 
			 foo = 10;
			 function foo (){}
			 var foo = 11;
			 return foo;
		}		
		go{
			bar:function bar() {....}
		}
		ao{
			foo: 11
		}
	</script>

go 与ao执行顺序 6

      <script type="text/javascript">
		// go{
		// 	a:100,
		// 	e:1,
		// 	demo:function demo(e) {...},
		// 	f:123
		// }
		a = 100;
		function demo(e) {
			// ao{
			// 	e:function e() {},
			// 	b:undefined,
			// 	c:undefined,
			// 	a:10,
			// 	
			// }
			function e() {}
			arguments[0] = 2;
			document.write(e);//2
			if (a) {
				var b = 123;
				function c() {
					// 猪都能做出来
				}
			}
			var c;
			a = 10;
			var a;
			document.write(b);//undefined
			f = 123;
			document.write(c);//undefined
			document.write(a+"-+---");//10
		}
		var a;
		demo(1);
		document.write(a+"-----");//100  (全局的100)
		document.write(f);//123
	</script>

go 与ao执行顺序 7