javaScript预编译

fun()
var fun=function(){} //报错

//等价于
var fun
fun()
fun=function(){}

javaScript的执行过程先扫描整体语法语句,如果存在逻辑错误或者语法错误,那么直接报错,程序停止执行,没有报错的,开始从上到下解释一行执行一行。

预编译

预编译代码执行前的操作,会变量提升、函数提升(具名函数)
变量提升会提升变量声明,不会提升变量赋值,一般是针对var声明的变量


局部变量
 1.声明变量,形参和变量声明
 2.实参值赋值给形参
 3.函数声明,赋值
 4.执行函数 

 function test(a){    //声明形参a:undfined,形参赋值a:undfined->a:1
    console.log(a);   //1
    var a=3;          //声明赋值 a:1->a:3
    console.log(a);//3
    }
 test(1) //函数执行


    function test(a){    //声明形参a:undefined,形参赋值a:undefined->a:1
      console.log(a);  //function a(){},函数提升a:1->function a(){}
     function a(){}    
     a=5;              //变量赋值a:function->a:5
     console.log(a);  //5
    }
    test(1)           //执行函数
  function test(a){   //声明形参a:undefined,形参赋值a:undefined->a:1
      console.log(a);  //function a(){},函数a函数提升a:1->a:function a(){}
      var a=1;         //变量赋值 a:function(){}-> a:1
      console.log(a);  //1
      function a(){};
      console.log(a);  //1
      var b=function(){};//b:undefined->function(){}
      console.log(b); //function(){} 
      function d(){}   // d:function d(){}
    }
    test(2)                //执行函数
      
function test(a,b){   //声明形参a:undefined,形参赋值a:undefined->a:1,声明形参b:undefined
  console.log(a);    //1
  c=0;
  var c;
  a=5;
  b=6;             //变量赋值function b(){}->6
  console.log(b);  //6
  function b(){};  //函数提升
  function d(){};
  console.log(b);  //6
}
test(1) //执行函数


 //a:undefined->1->5
 //b:undefined->function b(){}->6
 //c:undefined->0
 //d:function d(){}

全局变量 

1.找变量
 2.找函数声明
 3.执行

var a=1;
function a(){
  console.log(2);
}
console.log(a);  //1

//a:undefined->function a(){}->1
等同于
var a
function a(){
  console.log(2);
}
a=1
console.log(a);  //1
console.log(a,b);  //function a(){}  undefined
function a(){}
var b=function(){}

//b:undefined->function(){}
//a:undefined->function a(){}
//等同于
var b
function a(){}
console.log(a,b);  //function a(){}  undefined
b=function(){}
var foo = "Hello";
(function(){
    var bar = " World";
    console.log(foo + bar); //Hello World
})();
 console.log(foo + bar);//报错

全局:foo:undefined->hello
    function(){}
局部:bar:undefined->world
compute(10,100);
var compute = function(A,B) {
    console.info(A * B) ; //20
};
function compute(A,B){
    console.info(A + B);
}
function compute(A,B){
    console.info((A + B)*2); //220
}
compute(2,10);

//compute:undefined->function(){A+B}->function(){(A+B)*2}->执行compute(10,100)->function(){a*B}->compute(2,10)
//等同于
var compute
function compute(A,B){
    console.info(A + B);
}
function compute(A,B){
    console.info((A + B)*2); 
}
compute(10,100);   //220
compute = function(A,B) {
    console.info(A * B) ; 
};
compute(2,10);  //20
var b=3;
console.log(a);  //function a(){}外
function a(a){
  console.log(a); //function a(){}内
  var a=2;
  console.log(a); //2
  function a(){
    var b=5;
    console.log(b);//5
  }
}
a(1)

//全局 b:undefined->3
//     a:function a(){}
//局部 a:undefined->1->function a(){}->2
//     b:undefined->5

//等同于

var b
b=3
function a(a){
  var a //a:undefined->1
  function a(){
    var b
    b=5;
    console.log(b);//5
  }
  console.log(a); //function a(){}内
  a=2;
  console.log(a); //2
 
}
console.log(a);  //function a(){}外
a(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:undefined->1
//局部:a:undefined->2->3
function test(){
  console.log(b);  //undefined
  if(a){
    var b=2;
  }
  c=3;
  console.log(c);  //3
}
var a;
test();
a=1;
console.log(a);  //1

//全局:a:undefined->1
//     test:function test(){} 
//     c:undefined->3
//局部:b:undefined  (if语句预编译影响)

    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);
    console.log(a);  //1
    console.log(f); //5


全局:a:undefined->1
    test:function test(){}
    f:undefined->5
局部:e:undefined->function e(){}->2
     b:undefined
     c:undefined  
     a:undefined->4

 

var a = 1;
function fn(){
    console.log(a); //undefined
    var a = 5;
    console.log(a);  //5
    a++;
    var a;
    fn2();
    console.log(a);  //20
    function fn2(){
        console.log(a);  //6
        a = 20;
        b = 100;
    }
}
fn();
console.log(a);  //1
a = 10;
console.log(a);  //10
console.log(b);  //100

全局:a:undefined->1->10
     b:undefined->100
局部:a:undefined->5->6->20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值