JS function

function 声明提前(第一等公民)

<script>
    //一旦进入作用域,var function fun(){}提前
    //var 声明的 声明在前,赋值在后
    test();//aaa
    function test(){//声明  创建空间
        alert("aaa");
    }

    test1();//undefined  相当于在顶部声明 var test1;但是没有赋值,所以默认为undefined
    var test1 = function(){
        alert("bbb");
    }
    test1();//bbb
</script>

按值传递

<script>
    //按值传递  只是复制一个副本传递出去
    var a = 2;//开辟了一个空间a
    var b = a;//开辟了一个新的空间b
    //a取的a的值的副本,不是本身。
    //a和b是两个独立的习惯
    a = 3;//对于b的值没有影响,b=2;
//区别:
    var p = 2;
    function test(p){
        console.log(p);//2
        p = 3;//此时将副本的值改为3
        console.log(p);//3
    }
    test(p);//调用时找的是全局的p,传的是p的副本
    console.log(p);//2 副本改动不会影响本身
</script>
<script>
    var p = 2;
    function test(){
        console.log(p);//2
        p = 3;
        console.log(p);//3
    }
    test();
    console.log(p);//3
</script>

按址传递

<script>
    var obj = {p:1};//obj里存的是地址
    var ts = obj;//相当于是把obj的地址副本给了ts
    obj=null;//清空obj的地址,不影响ts
    console.log(ts);//{p:1}

    var obj1={p:1};
        function test(n){
            console.log(obj1);//obj1.p=1
            n.p = 2;
        }
        test(obj1);
        console.log(obj1);//ob1j.p=2
</script>
<script>
    var obj=[1,2,3];
    function test(o){
        console.log(o);//把obj地址副本传进来 取值 取原来的值
        o = [2,3,4];//开辟了一个局部空间把地址赋值给了o
        console.log(o);//obj里的地址发生了改变
    }
    test(obj);//这里是把obj地址的副本传进去
    console.log(obj);//按obj原地址取值
</script>

这里写图片描述

猜你喜欢

转载自blog.csdn.net/ssssssssolo/article/details/81978270