六市俊、函數(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啄枕,開(kāi)發(fā)者無(wú)需明確指出參數(shù)名,就能訪問(wèn)它們族沃。
    例如频祝,在函數(shù) sayHi() 中,第一個(gè)參數(shù)是 message脆淹。用 arguments[0]
    也可以訪問(wèn)這個(gè)值常空,即第一個(gè)參數(shù)的值(第一個(gè)參數(shù)位于位置 0,
    第二個(gè)參數(shù)位于位置 1盖溺,依此類(lèi)推)漓糙。

    • 例如: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ù)問(wèn)題:

    • 函數(shù)外面定義的變量是全局變量,函數(shù)內(nèi)可以直接使用
    • 在函數(shù)內(nèi)部沒(mé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

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

如果我在函數(shù)內(nèi)聲明計(jì)數(shù)器,如果沒(méi)有調(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ù)都能訪問(wèn)全局變量。

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

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

該實(shí)例中批什,內(nèi)嵌函數(shù) plus() 可以訪問(wèn)父函數(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ù)使用合呐。非常棒的部分是它可以訪問(wèn)函數(shù)上一層作用域的計(jì)數(shù)器暮的。

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

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

[圖片上傳失敗...(image-2de9e1-1632226684012)] 閉包是可訪問(wèn)上一層函數(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)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市犁享,隨后出現(xiàn)的幾起案子余素,更是在濱河造成了極大的恐慌,老刑警劉巖炊昆,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件桨吊,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凤巨,警方通過(guò)查閱死者的電腦和手機(jī)视乐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)敢茁,“玉大人佑淀,你說(shuō)我怎么就攤上這事≌妹剩” “怎么了伸刃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逢倍。 經(jīng)常有香客問(wèn)我捧颅,道長(zhǎng),這世上最難降的妖魔是什么较雕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任碉哑,我火速辦了婚禮,結(jié)果婚禮上亮蒋,老公的妹妹穿的比我還像新娘扣典。我一直安慰自己,他們只是感情好慎玖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布贮尖。 她就那樣靜靜地躺著,像睡著了一般趁怔。 火紅的嫁衣襯著肌膚如雪远舅。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,096評(píng)論 1 291
  • 那天痕钢,我揣著相機(jī)與錄音图柏,去河邊找鬼。 笑死任连,一個(gè)胖子當(dāng)著我的面吹牛蚤吹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼裁着,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼繁涂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起二驰,我...
    開(kāi)封第一講書(shū)人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扔罪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后桶雀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矿酵,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年矗积,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了全肮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡棘捣,死狀恐怖辜腺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乍恐,我是刑警寧澤评疗,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站茵烈,受9級(jí)特大地震影響百匆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞧毙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寄症。 院中可真熱鬧宙彪,春花似錦、人聲如沸有巧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)篮迎。三九已至男图,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間甜橱,已是汗流浹背逊笆。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留岂傲,地道東北人难裆。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親乃戈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褂痰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容