JS中的函數(shù)


title: JS中的函數(shù)
date: 2018-9-27 23:04:05
tags: [JavaScript]
categories: JavaScript


什么是函數(shù)

函數(shù)是一段可以反復(fù)調(diào)用的代碼塊。函數(shù)還能接受輸入的參數(shù),不同的參數(shù)會(huì)返回不同的值胜茧。
函數(shù)的本質(zhì)就是對(duì)象派阱,或者說(shuō)可以執(zhí)行代碼的對(duì)象就是函數(shù)窍霞。

函數(shù)的五種聲明方法

函數(shù)體內(nèi)部的return語(yǔ)句沦补,表示返回罩缴。JavaScript 引擎遇到return語(yǔ)句踢俄,就直接返回return后面的那個(gè)表達(dá)式的值缩功,后面即使還有語(yǔ)句,也不會(huì)得到執(zhí)行都办。也就是說(shuō)嫡锌,return語(yǔ)句所帶的那個(gè)表達(dá)式,就是函數(shù)的返回值琳钉。如果沒(méi)有return势木,該函數(shù)就返回undefined。

  • 具名函數(shù)
function fn1() {
   return undefined; // 如果不寫return 歌懒,瀏覽器默認(rèn)返回undefined
}  
  • 匿名函數(shù)
var fn2 = function() {}
  • 結(jié)合上面兩種方式(謹(jǐn)慎使用)
var fn3 = function fn4() {}
  • 使用Function函數(shù)對(duì)象
    new Function() 中啦桌,最后一個(gè)參數(shù)表示函數(shù)體,前面的參數(shù)表示傳入函數(shù)的參數(shù)及皂。
var fn5 = new Function(
  'x',
  'y',
  'return x + y'
);
  • 箭頭函數(shù)
var fn6 = (x,y) => {return x+y}  // 箭頭前面表示傳入函數(shù)的參數(shù)甫男,箭頭后面表示函數(shù)體且改。
var fn7 = x => {return x*2}  // 如果只有一個(gè)參數(shù),參數(shù)的圓括號(hào)可以省略
var fn8 = x => x*x  // 如果函數(shù)體只有一句話板驳,可以同時(shí)省略函數(shù)體的大括號(hào)及return

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

function fn(){ return undefined; }
fn()  // 執(zhí)行該函數(shù)钾虐。

作為初學(xué)者,更建議使用call()方法笋庄,call()的第一個(gè)參數(shù)是this效扫,后面的參數(shù)是arguments(偽數(shù)組)
例如:

function fn(x,y){ return x+y; }
fn.call(undefined,1,2) // 結(jié)果為3 等價(jià)于fn(1,2)

函數(shù)的常用屬性和方法

  • name 屬性
    每一個(gè)函數(shù)都有name屬性,但其值可能因不同的函數(shù)聲明方式而不同直砂。舉例:
// 具名函數(shù)的name屬性菌仁,表示函數(shù)的名字
function fn1() {} 
fn1.name // "fn1"

// 匿名函數(shù)的name屬性,指的是接收函數(shù)的變量名
var fn2 = function () {} 
fn2.name // "fn2"

// fn3.name返回函數(shù)表達(dá)式的名字静暂。真正的函數(shù)名還是fn3济丘,而fn4這個(gè)名字只在函數(shù)體內(nèi)部可用。
var fn3 = function fn4(){} 
fn3.name // "fn4"

// 使用Function()方法構(gòu)造函數(shù)洽蛀,函數(shù)的name屬性值為"anonymous"
var fn5 = new Function()
fn5.name // "anonymous"

// 箭頭函數(shù)的name屬性摹迷,指的也是接收函數(shù)的變量名
var fn6 = () => {}
fn6.name // "fn6"
  • length 屬性
    函數(shù)的length屬性返回函數(shù)預(yù)期傳入的參數(shù)個(gè)數(shù),即函數(shù)定義之中的參數(shù)個(gè)數(shù)郊供。
    常用來(lái)判斷定義時(shí)和調(diào)用時(shí)參數(shù)的差異
function fn(a, b) {}
fn.length // 2  不管調(diào)用時(shí)輸入了多少個(gè)參數(shù)峡碉,length屬性始終等于2。
  • toString() 方法
    函數(shù)的toString方法返回一個(gè)字符串驮审,內(nèi)容是函數(shù)的源碼鲫寄,包括函數(shù)中的注釋也會(huì)被打印出來(lái)。
function fn() {
  var a = 1
/*  我是
  注釋*/
}

fn.toString()
//   "function fn() {
//     var a = 1
//   /*  我是
//     注釋*/
//   }"

call apply bind 的用法

call() 方法調(diào)用一個(gè)函數(shù), 其具有一個(gè)指定的this值和分別地提供的參數(shù)(參數(shù)的列表)疯淫。
apply() 方法調(diào)用一個(gè)函數(shù), 其具有一個(gè)指定的this值地来,以及作為一個(gè)數(shù)組(或類似數(shù)組的對(duì)象)提供的參數(shù)。

  • apply和call二者作用一樣熙掺,只是接受參數(shù)的方式不一樣未斑,call需要把參數(shù)按順序傳遞進(jìn)去,而apply則是把參數(shù)放在數(shù)組里币绩。

bind() 方法創(chuàng)建一個(gè)新的函數(shù)蜡秽,被調(diào)用時(shí),將其this關(guān)鍵字設(shè)置為提供的值类浪,在調(diào)用新函數(shù)時(shí)载城,在任何提供之前提供一個(gè)給定的參數(shù)序列肌似。

  • bind 是創(chuàng)建對(duì)應(yīng)函數(shù)费就,非立即執(zhí)行;apply 川队、call會(huì)立即執(zhí)行函數(shù) 力细。

作用域

作用域(scope)指的是變量存在的范圍睬澡。
在 ES5 的規(guī)范中,Javascript 只有兩種作用域:
一種是全局作用域眠蚂,變量在整個(gè)程序中一直存在煞聪,所有地方都可以讀取逝慧;
另一種是函數(shù)作用域昔脯,變量只在函數(shù)內(nèi)部存在。ES6又新增了塊級(jí)作用域笛臣。

  • 在判斷作用域時(shí)云稚,還要注意函數(shù)作用域內(nèi)部會(huì)產(chǎn)生變量提升現(xiàn)象。
    var命令聲明的變量沈堡,不管在什么位置静陈,變量聲明都會(huì)被提升到函數(shù)體的頭部。

閉包

如果一個(gè)函數(shù)使用了它范圍外的變量诞丽,那么(這個(gè)函數(shù)和這個(gè)變量)就叫做閉包鲸拥。
具體介紹這里引用鏈接:
https://zhuanlan.zhihu.com/p/22486908

回調(diào)(callback)

名詞解釋:被當(dāng)做參數(shù)的函數(shù)就是回調(diào)函數(shù)
動(dòng)詞解釋:調(diào)用這個(gè)回調(diào)
舉例:
fn(function(){}) :函數(shù)fn中的參數(shù)是一個(gè)函數(shù),在fn中調(diào)用了這個(gè)函數(shù)僧免,那么這個(gè)函數(shù)就是回調(diào)函數(shù)刑赶,調(diào)用的過(guò)程就是回調(diào)。

立即執(zhí)行函數(shù)的使用

我的MVC篇中有用到立即執(zhí)行函數(shù)懂衩,并有詳細(xì)講解角撞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市勃痴,隨后出現(xiàn)的幾起案子谒所,更是在濱河造成了極大的恐慌,老刑警劉巖沛申,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件劣领,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡铁材,警方通過(guò)查閱死者的電腦和手機(jī)尖淘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)著觉,“玉大人村生,你說(shuō)我怎么就攤上這事”穑” “怎么了趁桃?”我有些...
    開(kāi)封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我卫病,道長(zhǎng)油啤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任蟀苛,我火速辦了婚禮益咬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘帜平。我一直安慰自己幽告,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布裆甩。 她就那樣靜靜地躺著评腺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪淑掌。 梳的紋絲不亂的頭發(fā)上蒿讥,一...
    開(kāi)封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音抛腕,去河邊找鬼芋绸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛担敌,可吹牛的內(nèi)容都是我干的摔敛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼全封,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼马昙!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起刹悴,我...
    開(kāi)封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤行楞,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后土匀,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體子房,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年就轧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了证杭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妒御,死狀恐怖解愤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情乎莉,我是刑警寧澤送讲,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布奸笤,位于F島的核電站,受9級(jí)特大地震影響李茫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肥橙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一魄宏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧存筏,春花似錦宠互、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至善茎,卻和暖如春券册,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背垂涯。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工烁焙, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耕赘。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓骄蝇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親操骡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子九火,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • 函數(shù)和對(duì)象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對(duì)于任何一門語(yǔ)言來(lái)說(shuō)都是核心的概念册招。通過(guò)函數(shù)可以封裝任意多條語(yǔ)句岔激,而且...
    道無(wú)虛閱讀 4,566評(píng)論 0 5
  • 【0620今日話題】 在你看來(lái),“人格魅力”最重要的三點(diǎn)體現(xiàn)是什么是掰? (話題來(lái)自貓友Octavia) 自信心 幽默...
    梓毓爸閱讀 134評(píng)論 0 0
  • 這個(gè)世界上影響別人的唯一方式是與別人談?wù)撍麄兿胍臇|西冀惭,并告訴他們?nèi)绾蔚玫剿鹦稹4鳡柨突?我們內(nèi)在的蜥蜴追逐自己的...
    戴盛閱讀 270評(píng)論 0 2
  • 目錄 Java 入口方法獲取用戶鍵盤輸入系統(tǒng)相關(guān)的兩個(gè)類:System Runtime處理日期的類:Date 和 ...
    Ansaxnsy閱讀 1,680評(píng)論 0 2
  • 【摘】 每個(gè)人都有他自己發(fā)展的時(shí)區(qū),最蠢的人就是拿別人的時(shí)區(qū)對(duì)比自己散休,然后焦慮不安媒楼,一定要催促自己加緊腳步發(fā)展,最...
    月羊不是羊閱讀 190評(píng)論 0 1