函数作用域&预处理机制

浏览器解读代码时,会按照以下顺序进行加载,先是对var 声明的变量进行预处理,只声明不复制,之后对于函数声明进行提升,并把函数的内容打印到函数名的后面,最后对于参数进行处理。
之后浏览器按照代码加载顺序,逐行解析代码,遇到表达式再开始赋值,同时修改仓库里面的值。

    function a(b){
        alert(b);
        function b(){
            alert(b);       //此处弹出function b
        };
        b();            //此处弹出 function b
    }
    a(1);

    var n=0;
    function a(){
        var n=10;
        function b(){
            n++;
            alert(n);
        }
        b();
        return b;
    }
    var c=a();     //此处执行了一遍a函数 -->11
    c();            // -->12
    alert(n)       // -->0
    alert(a);
    var a=1;
    alert(a);
    function a(){
        alert (2);
    }
    alert(a);
    function a(){
        alert(4)
    }
    alert(a);

不同script添加的js文件,可以建立向前方的依赖关系,但是之前的不能取到后方的内容。由此可以总结出,对于此种情况下的js作用域,是自上而下的,类似于函数中由内及外的作用域关系。

    var a=1;
    function fn1(){
        alert (a);
        var a=2;
    }
    fn1();              //函数内声明的a在作用域上优于父级函数的声明,但是由于只声明 未赋值,因此弹出undefine;
    alert(a);           //1
var a=1;
function fn1(a){
    alert(a);
    a=2;
}
fn1();          // undefine 此时a应该为传递进的参数
alert(a);           //1

不论函数还是变量,都是有作用域的,而预解析只能是在同一作用域下提前解析。
作用域是看的函数声明或者变量所定义的位置,而不是调用它们的位置。

    function fn1(){
        var a='eva';
        fn2();
    }
    function fn2(){
        alert(a);
    }
    fn1();               // 报错 由于fn2所在的作用域中没有声明a
    function fn1(){
        var a='eva';
        fn2(a);         
    }
    function fn2(a){
        alert(a)
    }
    fn1();          //弹出eva

你可能感兴趣的:(函数作用域&预处理机制)