8.JavaScript函數(shù)(聲明函數(shù)肆资、調(diào)用函數(shù)灶芝、函數(shù)的參數(shù)唉韭、函數(shù)的返回值 return 語句犯犁、break ,continue ,return 的區(qū)別属愤、arguments的使用酸役、函數(shù)的兩種聲明方...

2 - 函數(shù)

2.1 函數(shù)的概念

? 在 JS 里面,可能會定義非常多的相同代碼或者功能相似的代碼只壳,這些代碼可能需要大量重復(fù)使用暑塑。雖然 for循環(huán)語句也能實現(xiàn)一些簡單的重復(fù)操作,但是比較具有局限性惕艳,此時我們就可以使用 JS 中的函數(shù)驹愚。

? 函數(shù):就是封裝了一段可被重復(fù)調(diào)用執(zhí)行的代碼塊。通過此代碼塊可以實現(xiàn)大量代碼的重復(fù)使用谁鳍。

2.2 函數(shù)的使用

聲明函數(shù)

// 聲明函數(shù)
function 函數(shù)名() {
    //函數(shù)體代碼
}
  • function 是聲明函數(shù)的關(guān)鍵字,必須小寫

  • 由于函數(shù)一般是為了實現(xiàn)某個功能才定義的劫瞳, 所以通常我們將函數(shù)名命名為動詞,比如 getSum

調(diào)用函數(shù)

// 調(diào)用函數(shù)
函數(shù)名();  // 通過調(diào)用函數(shù)名來執(zhí)行函數(shù)體代碼
  • 調(diào)用的時候千萬不要忘記添加小括號

  • 口訣:函數(shù)不調(diào)用涮因,自己不執(zhí)行

    注意:聲明函數(shù)本身并不會執(zhí)行代碼伺绽,只有調(diào)用函數(shù)時才會執(zhí)行函數(shù)體代碼。

函數(shù)的封裝

  • 函數(shù)的封裝是把一個或者多個功能通過函數(shù)的方式封裝起來澜掩,對外只提供一個簡單的函數(shù)接口

  • 簡單理解:封裝類似于將電腦配件整合組裝到機(jī)箱中 ( 類似快遞打包)

例子:封裝計算1-100累加和


/* 
   計算兩個數(shù)字之間累加和的函數(shù)
*/
// 聲明函數(shù)
function getSum(num1, num2){
  var sumNum = 0;// 準(zhǔn)備一個變量杖挣,保存數(shù)字和
  for (var i = num1; i <= num2; i++) {
    sumNum += i;// 把每個數(shù)值 都累加 到變量中
  }
  alert(sumNum);
}
// 調(diào)用函數(shù)
 getSum(1, 100);
 getSum(10, 50);
 getSum(1, 1000);

2.3 函數(shù)的參數(shù)

函數(shù)參數(shù)語法

  • 形參:函數(shù)定義時設(shè)置接收調(diào)用時傳入

  • 實參:函數(shù)調(diào)用時傳入小括號內(nèi)的真實數(shù)據(jù)

? 參數(shù)的作用 : 在函數(shù)內(nèi)部某些值不能固定程梦,我們可以通過參數(shù)在調(diào)用函數(shù)時傳遞不同的值進(jìn)去橘荠。

函數(shù)參數(shù)的運用:

// 帶參數(shù)的函數(shù)聲明
function 函數(shù)名(形參1, 形參2 , 形參3...) { // 可以定義任意多的參數(shù)郎逃,用逗號分隔
  // 函數(shù)體
}
// 帶參數(shù)的函數(shù)調(diào)用
函數(shù)名(實參1, 實參2, 實參3...); 
  1. 調(diào)用的時候?qū)崊⒅凳莻鬟f給形參的
  2. 形參簡單理解為:不用聲明的變量
  3. 實參和形參的多個參數(shù)之間用逗號(,)分隔

函數(shù)形參和實參數(shù)量不匹配時

注意:在JavaScript中,形參的默認(rèn)值是undefined朵你。

小結(jié):

  • 函數(shù)可以帶參數(shù)也可以不帶參數(shù)
  • 聲明函數(shù)的時候揣非,函數(shù)名括號里面的是形參,形參的默認(rèn)值為 undefined
  • 調(diào)用函數(shù)的時候忌傻,函數(shù)名括號里面的是實參
  • 多個參數(shù)中間用逗號分隔
  • 形參的個數(shù)可以和實參個數(shù)不匹配搞监,但是結(jié)果不可預(yù)計,我們盡量要匹配

2.4 函數(shù)的返回值

return 語句

返回值:函數(shù)調(diào)用整體代表的數(shù)據(jù)俘种;函數(shù)執(zhí)行完成后可以通過return語句將指定數(shù)據(jù)返回 绝淡。

// 聲明函數(shù)
function 函數(shù)名(){
    ...
    return  需要返回的值;
}
// 調(diào)用函數(shù)
函數(shù)名();    // 此時調(diào)用函數(shù)就可以得到函數(shù)體內(nèi)return 后面的值

(1) 函數(shù)只是實現(xiàn)某種功能荐类,最終的結(jié)果需要返回給函數(shù)的調(diào)用者函數(shù)名()茁帽,通過return 實現(xiàn)的
(2) 只要函數(shù)遇到return 就把后面的結(jié)果 返回給函數(shù)的調(diào)用者屈嗤, 函數(shù)名() = return后面的結(jié)果

  • 在使用 return 語句時,函數(shù)會停止執(zhí)行铁追,并返回指定的值

  • 如果函數(shù)沒有 return 茫船,返回的值是 undefined

  • 求任意兩個數(shù)的和

        function getSum(num1, num2) {
            return num1 + num2;
        }
        console.log(getSum(1, 2));
  • 求兩個數(shù)的最大值
        function getMax(num1, num2) {
            // if (num1 > num2) {
            //     return num1;
            // } else {
            //     return num2;
            // }
            return num1 > num2 ? num1 : num2;
        }
        console.log(getMax(1, 3)); // 3
        console.log(getMax(11, 3)); // 11
  • 求數(shù)組中的最大數(shù)值扭屁。
 // 利用函數(shù)求數(shù)組 [5,2,99,101,67,77] 中的最大數(shù)值涩禀。
        function getArrMax(arr) { // arr 接受一個數(shù)組  arr =  [5,2,99,101,67,77]
            var max = arr[0];
            for (var i = 1; i <= arr.length; i++) {
                if (arr[i] > max) {
                    max = arr[i];
                }
            }
            return max;
        }
         // getArrMax([5, 2, 99, 101, 67, 77]); // 實參是一個數(shù)組送過去
        // 在我們實際開發(fā)里面艾船,我們經(jīng)常用一個變量來接受 函數(shù)的返回結(jié)果 使用更簡單
        // var re = getArrMax([5, 2, 99, 101, 67, 77]);
        var re = getArrMax([3, 77, 44, 99, 143]);// 兩種括號寫法都可以
        console.log(re);
函數(shù)返回值注意事項
        // 1. return 終止函數(shù)
        function getSum(num1, num2) {
            return num1 + num2; // return 后面的代碼不會被執(zhí)行
            alert('我是不會被執(zhí)行的哦!')
        }
        console.log(getSum(1, 2));
        // 2. return 只能返回一個值
        function fn(num1, num2) {
            return num1, num2; // 返回的結(jié)果是最后一個值
        }
        console.log(fn(1, 2));
        // 3.  我們求任意兩個數(shù)的 加減乘數(shù)結(jié)果
        function getResult(num1, num2) {
            return [num1 + num2, num1 - num2, num1 * num2, num1 / num2];
        }
        var re = getResult(1, 2); // 返回的是一個數(shù)組
        console.log(re);
        // 4. 我們的函數(shù)如果有return 則返回的是 return 后面的值践宴,如果函數(shù)沒有 return 則返回undefined
        function fun1() {
            return 666;
        }
        console.log(fun1()); // 返回 666
        function fun2() {

        }
        console.log(fun2()); // 函數(shù)返回的結(jié)果是 undefined

break ,continue ,return 的區(qū)別

  • break :結(jié)束當(dāng)前的循環(huán)體(如 for爷怀、while)
  • continue :跳出本次循環(huán),繼續(xù)執(zhí)行下次循環(huán)(如 for磺浙、while)
  • return :不僅可以退出循環(huán)徒坡,還能夠返回 return 語句中的值,同時還可以結(jié)束當(dāng)前的函數(shù)體內(nèi)的代碼

2.5 arguments的使用

? 當(dāng)不確定有多少個參數(shù)傳遞的時候伦泥,可以用 arguments 來獲取锦溪。JavaScript 中,arguments實際上它是當(dāng)前函數(shù)的一個內(nèi)置對象刻诊。所有函數(shù)都內(nèi)置了一個 arguments 對象,arguments 對象中存儲了傳遞的所有實參复局。arguments展示形式是一個偽數(shù)組粟判,因此可以進(jìn)行遍歷(并不是真正意義上的數(shù)組)。偽數(shù)組具有以下特點:

  • 具有 length 屬性

  • 按索引方式儲存數(shù)據(jù)

  • 不具有數(shù)組的 push , pop 等方法

    注意:在函數(shù)內(nèi)部使用該對象角钩,用此對象獲取函數(shù)調(diào)用時傳的實參。

2.6 函數(shù)案例

函數(shù)內(nèi)部可以調(diào)用另一個函數(shù)递礼,在同一作用域代碼中脊髓,函數(shù)名即代表封裝的操作,使用函數(shù)名加括號即可以將封裝的操作執(zhí)行供炼。

  • 利用函數(shù)求任意個數(shù)的最大值
       function getMax() { // arguments = [1,2,3]
           var max = arguments[0];
           for (var i = 1; i < arguments.length; i++) {
               if (arguments[i] > max) {
                   max = arguments[i];
               }
           }
           return max;
       }
       console.log(getMax(1, 2, 3));
       console.log(getMax(1, 2, 3, 4, 5));
       console.log(getMax(11, 2, 34, 444, 5, 100));
  • 利用函數(shù)翻轉(zhuǎn)任意數(shù)組 reverse 翻轉(zhuǎn)
        function reverse(arr) {
            var newArr = [];
            for (var i = arr.length - 1; i >= 0; i--) {
                newArr[newArr.length] = arr[i];
            }
            return newArr;
        }
        var arr1 = reverse([1, 3, 4, 6, 9]);
        console.log(arr1);
        var arr2 = reverse(['red', 'pink', 'blue']);
        console.log(arr2);
  • 利用函數(shù)冒泡排序 sort 排序
        function sort(arr) {
            for (var i = 0; i < arr.length - 1; i++) {
                for (var j = 0; j < arr.length - i - 1; j++) {
                    if (arr[j] > arr[j + 1]) {
                        var temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
            }
            return arr;
        }
        var arr1 = sort([1, 4, 2, 9]);
        console.log(arr1);
        var arr2 = sort([11, 7, 22, 999]);
        console.log(arr2);
  • 利用函數(shù)判斷閏年
        function isRunYear(year) {
            // 如果是閏年我們返回 true  否則 返回 false 
            var flag = false;
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                flag = true;
            }
            return flag;
        }
        console.log(isRunYear(2000));
        console.log(isRunYear(1999));
  • 函數(shù)是可以相互調(diào)用的
        // function fn1() {
        //     console.log(11);
        //     fn2(); // 在fn1 函數(shù)里面調(diào)用了 fn2 函數(shù)
        // }
        // fn1();

        // function fn2() {
        //     console.log(22);

        // }

        function fn1() {
            console.log(111);
            fn2();
            console.log('fn1');
        }

        function fn2() {
            console.log(222);
            console.log('fn2');
        }
        fn1();
  • 用戶輸入年份冀墨,輸出當(dāng)前年份2月份的天數(shù)
        function backDay() {
            var year = prompt('請您輸入年份:');
            if (isRunYear(year)) { // 調(diào)用函數(shù)需要加小括號
                alert('當(dāng)前年份是閏年2月份有29天');
            } else {
                alert('當(dāng)前年份是平年2月份有28天');
            }
        }
        backDay();

        // 判斷是否為閏年的函數(shù)
        function isRunYear(year) {
            // 如果是閏年我們返回 true  否則 返回 false 
            var flag = false;
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                flag = true;
            }
            return flag;
        }

2.7 函數(shù)的兩種聲明方式

  • 自定義函數(shù)方式(命名函數(shù))

    利用函數(shù)關(guān)鍵字 function 自定義函數(shù)方式

    // 聲明定義方式
    function fn() {...}
    // 調(diào)用  
    fn();  
    
    • 因為有名字涛贯,所以也被稱為命名函數(shù)
    • 調(diào)用函數(shù)的代碼既可以放到聲明函數(shù)的前面,也可以放在聲明函數(shù)的后面
  • 函數(shù)表達(dá)式方式(匿名函數(shù))

    利用函數(shù)表達(dá)式方式的寫法如下:

    // 這是函數(shù)表達(dá)式寫法虫腋,匿名函數(shù)后面跟分號結(jié)束
    var fn = function(){...}稀余;
    // 調(diào)用的方式,函數(shù)調(diào)用必須寫到函數(shù)體下面
    fn();
    

(1) fn是變量名 不是函數(shù)名
(2) 函數(shù)表達(dá)式聲明方式跟聲明變量差不多盒蟆,只不過變量里面存的是值 而 函數(shù)表達(dá)式里面存的是函數(shù)
(3) 函數(shù)表達(dá)式也可以進(jìn)行傳遞參數(shù)

  • 因為函數(shù)沒有名字师骗,所以也被稱為匿名函數(shù)
  • 這個fn 里面存儲的是一個函數(shù)
  • 函數(shù)表達(dá)式方式原理跟聲明變量方式是一致的
  • 函數(shù)調(diào)用的代碼必須寫到函數(shù)體后面
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市寒屯,隨后出現(xiàn)的幾起案子黍少,更是在濱河造成了極大的恐慌,老刑警劉巖要出,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件农渊,死亡現(xiàn)場離奇詭異,居然都是意外死亡砸紊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門沼溜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來游添,“玉大人唆涝,你說我怎么就攤上這事±群ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵晓猛,是天一觀的道長凡辱。 經(jīng)常有香客問我,道長透乾,這世上最難降的妖魔是什么续徽? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮纫版,結(jié)果婚禮上客情,老公的妹妹穿的比我還像新娘。我一直安慰自己膀斋,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布糊识。 她就那樣靜靜地躺著,像睡著了一般赂苗。 火紅的嫁衣襯著肌膚如雪拌滋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天败砂,我揣著相機(jī)與錄音,去河邊找鬼坚芜。 笑死祭隔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疾渴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼搔谴,長吁一口氣:“原來是場噩夢啊……” “哼桩撮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起芜果,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤融师,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后舀射,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怀伦,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年驼抹,在試婚紗的時候發(fā)現(xiàn)自己被綠了张抄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片洼怔。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖镣隶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轻猖,我是刑警寧澤域那,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站败许,受9級特大地震影響淑蔚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刹衫,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一带迟、第九天 我趴在偏房一處隱蔽的房頂上張望音羞。 院中可真熱鬧仓犬,春花似錦、人聲如沸办陷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽制圈。三九已至们童,卻和暖如春鲸鹦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背齐板。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工葛菇, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人济舆。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓莺债,卻偏偏與公主長得像,于是被迫代替她去往敵國和親齐邦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345