六、函數(shù)定義

一、函數(shù)的定義

JavaScript三種定義函數(shù)方法:

1、第一種 使用function語(yǔ)句定義函數(shù)

myFunction(5);
function myFunction(y) {
    return y * y;
}

2、第二種 使用Function()構(gòu)造函數(shù)來(lái)定義函數(shù)(不常用)

var 函數(shù)名 = new Function(“參數(shù)1”,”參數(shù)2”,”參數(shù)3”……”函數(shù)體”);
如:
var 函數(shù)名 = new Function("x","y","var z=x+y;return z;");

3、第三種 函數(shù)表達(dá)式

JavaScript 函數(shù)可以通過(guò)一個(gè)表達(dá)式定義。

函數(shù)表達(dá)式可以存儲(chǔ)在變量中:

var 函數(shù)名 = function(參數(shù)1,參數(shù)2,…){函數(shù)體};
//例如:
//定義
    var add = function(a,b){
        return a+b;
    }
    //調(diào)用函數(shù)
    document.write(add(50,20));

4、第四種 自調(diào)用函數(shù)

  • 概述

    • 函數(shù)表達(dá)式可以 "自調(diào)用"。

    • 自調(diào)用表達(dá)式會(huì)自動(dòng)調(diào)用。

    • 如果表達(dá)式后面緊跟 () ,則會(huì)自動(dòng)調(diào)用。

    • 不能自調(diào)用聲明的函數(shù)。

    • 通過(guò)添加括號(hào),來(lái)說(shuō)明它是一個(gè)函數(shù)表達(dá)式:

  • 實(shí)例:

    (function () {
        var x = "Hello!!";      // 我將調(diào)用自己
    })();
    
  • 注意:

    arguments 對(duì)象

    在函數(shù)代碼中,使用特殊對(duì)象 arguments,開發(fā)者無(wú)需明確指出參數(shù)名,就能訪問它們。
    例如,在函數(shù) sayHi() 中,第一個(gè)參數(shù)是 message。用 arguments[0]
    也可以訪問這個(gè)值,即第一個(gè)參數(shù)的值(第一個(gè)參數(shù)位于位置 0,
    第二個(gè)參數(shù)位于位置 1,依此類推)。

    • 例如:arguments

      x = sumAll(1, 123, 500, 115, 44, 88);
      
      function sumAll() {
          var i, sum = 0;
          for (i = 0; i < arguments.length; i++) {
              sum += arguments[I];
          }
          return sum;
      }
      
  • 關(guān)于變量和參數(shù)問題:

    • 函數(shù)外面定義的變量是全局變量,函數(shù)內(nèi)可以直接使用
    • 在函數(shù)內(nèi)部沒有使用var定義的=變量則為全局變量
    • 在函數(shù)內(nèi)使用var關(guān)鍵字定義的變量是局部變量,即出了函數(shù)外邊無(wú)法獲取。
      函數(shù)支持默認(rèn)值
    • 在函數(shù)內(nèi)部定義的函數(shù)為局部函數(shù) 在函數(shù)外部不能獲取到

二、JavaScript 閉包

1、概述

  • JavaScript 變量可以是局部變量或全局變量。
  • 私有變量可以用到閉包
  • 函數(shù)內(nèi)部可以修改函數(shù)外部的全局變量

2、計(jì)數(shù)器困境

設(shè)想下如果你想統(tǒng)計(jì)一些數(shù)值,且該計(jì)數(shù)器在所有函數(shù)中都是可用的。

你可以使用全局變量,函數(shù)設(shè)置計(jì)數(shù)器遞增:

var counter = 0;
 
function add() {
   return counter += 1;
}
 
add();
add();
add();
 
// 計(jì)數(shù)器現(xiàn)在為 3

但問題來(lái)了,頁(yè)面上的任何腳本都能改變計(jì)數(shù)器,即便沒有調(diào)用 add() 函數(shù)。

如果我在函數(shù)內(nèi)聲明計(jì)數(shù)器,如果沒有調(diào)用函數(shù)將無(wú)法修改計(jì)數(shù)器的值:

function add() {
    var counter = 0;
    return counter += 1;
}
 
add();
add();
add();
// 本意是想輸出 3, 但事與愿違,輸出的都是 1 !

3、JavaScript 內(nèi)嵌函數(shù)

所有函數(shù)都能訪問全局變量。

實(shí)際上,在 JavaScript 中,所有函數(shù)都能訪問它們上一層的作用域。

JavaScript 支持嵌套函數(shù)。嵌套函數(shù)可以訪問上一層的函數(shù)變量。

該實(shí)例中,內(nèi)嵌函數(shù) plus() 可以訪問父函數(shù)的 counter 變量:

實(shí)例:

function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();    
    return counter; 
}

4、JavaScript 閉包

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();
 
add();
add();
add();
 
// 計(jì)數(shù)器為 3
  • 實(shí)例解析

    變量 add 指定了函數(shù)自我調(diào)用的返回字值。

    自我調(diào)用函數(shù)只執(zhí)行一次。設(shè)置計(jì)數(shù)器為 0。并返回函數(shù)表達(dá)式。

    add變量可以作為一個(gè)函數(shù)使用。非常棒的部分是它可以訪問函數(shù)上一層作用域的計(jì)數(shù)器。

    這個(gè)叫作 JavaScript 閉包。它使得函數(shù)擁有私有變量變成可能。

    計(jì)數(shù)器受匿名函數(shù)的作用域保護(hù),只能通過(guò) add 方法修改。

[圖片上傳失敗...(image-2de9e1-1632226684012)] 閉包是可訪問上一層函數(shù)作用域里變量的函數(shù),即便上一層函數(shù)已經(jīng)關(guān)閉。
閉包就是一個(gè)函數(shù)引用另一個(gè)函數(shù)的變量,因?yàn)樽兞勘灰弥圆粫?huì)被回收,因此可以用來(lái)封裝一個(gè)私有變量。這是優(yōu)點(diǎn)也是缺點(diǎn),不必要的閉包只會(huì)增加內(nèi)存消耗。 或者說(shuō)閉包就是子函數(shù)可以使用父函數(shù)的局部變量,還有父函數(shù)的參數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容