JS函數

JS函數

函數的封裝

傳統方式

function 函數名(){}

該方式的函數有“預加載”過程,允許我們先調用函數、再聲明函數

預加載:代碼先把函數的聲明放入內存。代碼看起來是先調用、後聲明,本質是先聲明、後調用的。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script type="text/javascript">
        getInfo();
        function getInfo() {
            console.log("hello");
        }

    </script>
</head>
<body>

</body>
</html>

函數先調用、後聲明的條件是,全部代碼在一個”<script>”標記裏邊。

如下所示:將會報錯

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script type="text/javascript">
        getInfo();
    </script>
    
    <script type="text/javascript">
        function getInfo() {
            console.log("hello");
        }

    </script>
  
</head>
<body>

</body>
</html>

變量賦值方式聲明函數(匿名函數使用)

var 函數名 = function(){}

該方式沒有“預加載”,必須先聲明、後調用。

<script type="text/javascript">
        var getName=function () {
            console.log("hello");
        }
        getName();
</script>

函數的參數

實參和形參的對應關係

在javascript裏邊:實參與形參沒有嚴格的對應關係

<script type="text/javascript">
        function f1(name,age,addr='beijing') {
            console.log("名字:"+name+" 年齡:"+age+" 地址:"+addr);
        }
        f1("csx",12);
        f1("csx",13,"shanghai");
        f1("csx");
        f1();
</script>`

關鍵字arguments

利用arguments可以在函數裏邊接收實參信息。

<script type="text/javascript">
        function f1() {
            var len=arguments.length;
            if(len==0){
                console.log("個人信息:");
            }else if(len==1){
                console.log("個人信息:"+" 名字:"+arguments[0]);
            }else if(len==2){
                console.log("個人信息:"+" 名字:"+arguments[0]+" 年齡:"+arguments[1]);
            }else if(len==3){
                console.log("個人信息:"+" 名字:"+arguments[0]+" 年齡:"+arguments[1]+" 地址:"+arguments[2]);
            }
        }
        f1();
        f1("csx");
        f1("csx",12);
        f1("csx",13,"shanghai");
    </script>

callee關鍵字

在函數內部使用:代表當前函數的引用

耦合一處代碼的修改會導致其他代碼也要發生改變。 在程序項目裏邊要開發低耦合度的代碼。

<script type="text/javascript">
        //callee可以降低代碼的耦合度
        function jiecheng(n) {
           if(n==1){
               return 1;
           }else{
               return n*arguments.callee(n-1);
           }
        }
        console.log(jiecheng(5));
        console.log(jiecheng(6));

        var jc=jiecheng; //把jiecheng函數的引用傳遞給變量jc一份,使得jc也可以當函數使用
        jiecheng=null;//把jiecheng函數給銷燬,避免後面代碼使用
        console.log(jc(7));
</script>

函數返回值

函數返回,使用return關鍵字返回信息

return可以返回全部的數據類型,return本身還可以結束函數的執行

return還可以返回一個對象,因爲函數是對象,所有也可以返回函數

<script type="text/javascript">
        function f1() {
            var name="csx";
            var age=12;
            var addr="beijing";
            //內部嵌套函數
            function f2() {
                console.log("I am f2");
            }
            return f2;//把函數返回
        }
        var ff=f1();//f1執行完畢後的返回值被ff接受
        //一個對象(f1()的返回值)對另一個變量賦值,是引用傳遞
        ff();
</script>

f2和ff是兩個不同的引用,但是都指向同一個函數體

函數調用

傳統方式調用

函數名()

匿名函數自調用

(function(){})()

<script type="text/javascript">
        var f1=function () {
            console.log("f1f1f1");
        }
        var f1="tom";//同名的f1把上面的函數給覆蓋/污染了
        f1();
        //匿名函數自調用,好處:本身不會被同名變量污染
        (function () {
            console.log("hello");
        })();
        (function () {
            console.log("地址是:"+addr)
        })("北京");
</script>

匿名函數自調用,好處:本身不會被同名變量污染

全局/局部變量

  • 全局變量

① 在函數外部聲明的變量

② 函數內部不使用“var”聲明的變量(函數調用之後起作用)

<script type="text/javascript">
        //全局變量:函數外部聲明
        var name="csx";
        function f1() {
            console.log("name:"+name);
            name="ccc";
        }
        f1();
        console.log("name:"+name);
        function f2() {
            //全局變量:函數內部不使用"var"聲明(函數調用後起作用)
            age=12;
            console.log("age:"+age);
        }
        f2();
        age=18;
        console.log("age:"+age);



</script>
  • 局部變量

在函數內部聲明的變量,變量前邊有”var“關鍵字。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章