JS预解析

    JS预解析过程是由浏览器中的Javascript解析器执行

    解析步骤:
    1、首先查找代码中的var 和 function
    2、如果遇到var关键字,则先为变量赋值为undefined,而不是执行表达式中的赋值操作,赋值操作在后面的代码解析中执行
    2、如果解析到函数的定义,则解析为函数
    3、然后逐行解析代码,执行代码中的表达式(比如赋值,计算,类型转换等)或者函数调用

    实例分析
    alert(a); //弹出undefined
    var a = 1;
    function b(){
    alert(a) //弹出1
    }
    1、首先查找到变量a、和函数b
    2、为变量a赋值为undefined,
    3、开始逐行解析代码
    4、在执行alert(a); 时,此时a的值还是undefined,因此弹出的提示为:undefined
    5、接着执行 var a=1; ,此时变量a的值为1
    6、再执行b,弹出提示框,内容为变量a的值,此时变量a已被赋值为1,因此弹出的内容为1

    预解析过程中所遇到的一些特殊情况
    1、当函数与变量重名时,会被预解析为函数
    2、当函数名相同时,最后被预解析的函数会覆盖上一个同名函数
    3、遇到表达式(赋值、计算、类型转换等),变量值和类型都会被覆盖,即表达式可以修改预解析的值

    实例分析
    alert(a); //弹出函数a,同名函数解析为最后定义的函数
    var a = 1; //变量a赋值为1
    alert(a); //弹出1
    function a() {
    alert(2); //不执行,被下面定义的同名函数所覆盖
    }
    var a = 2; //变量a赋值为2
    alert(a); //弹出2
    function a() {
    alert(3); //不执行,这里执行定义,没有执行
    }
    a();
    //报错了,因为var a=2;已经在把预解析中的函数a改变为数据类型为整型的变量a,因此a()被解析为 2();,在解析器中不通过

    作用域的预解析机制
    全局作用域是指定义
    var a = 1;
    function fn1() {
    alert(a);
    var a=2;
    }
    fn1();
    alert(a);


    var a = 1;
    function fn1() {
    alert(a);
    a=2;
    }
    fn1();
    alert(a);

    var a = 1;
    function fn1(a) {
    alert(a);
    a=2;
    }
    fn1();
    alert(a);


    var a = 1;
    function fn1(a) {
    alert(a); //1
    a=2;
    }
    fn1();
    alert(a); //


    function fn1() {
    var a=1;
    }
    function fn2() {
    alert(a);
    }

    for循环的作用域
    html:



    javascript:
    var btns = document.getElementsByTagName(‘input’);
    for(var i=0; ibtns[i].onclick = function() {
    alert(i) // i等于3
    }
    }


    html:



    javascript:
    var btns = document.getElementsByTagName(‘input’);
    for(var i=0; ibtns[i].onclick = function() {
    alert(i) // i等于undefined
    for(var i=0; i//do sth
    }
    }

    }