JavaScript函數(shù)全解

1.函數(shù)聲明

JavaScript函數(shù)有匿名函數(shù)解虱、具名函數(shù)和箭頭函數(shù)三種攘须。

匿名函數(shù)
let fn = function () {
  return 1
} //引用匿名函數(shù)的地址
let fn2 = fn //引用匿名函數(shù)地址
console.log(fn.name) //fn
console.log(fn2.name) //fn

函數(shù)就是對象漆撞,對象存在堆內(nèi)存里面殴泰。匿名函數(shù)的函數(shù)名就是引用它的變量的名字。

具名函數(shù)
function fn3() {
  return 3
}
console.log(fn3.name)  //fn3

let fn5 = function fn4() {
  return 4
}
console.log(fn4.name) //Uncaught ReferenceError: fn4 is not defined
console.log(fn5.name) //fn4

fn3的作用域的全局浮驳,fn5引用了fn4悍汛,所以fn4的作用域是函數(shù)本身。

箭頭函數(shù)
let fn6 = i => i + 1  //一個參數(shù)寫法
let fn7 = (i, j) => {  //多個參數(shù)寫法
  console.log(i, j)
  return i + j;
}

箭頭函數(shù)沒有name至会,但是箭頭函數(shù)沒有this

2.詞法作用域(靜態(tài)作用域)

靜態(tài)作用域又叫做詞法作用域离咐,采用詞法作用域的變量叫詞法變量。詞法變量有一個在編譯時靜態(tài)確定的作用域奉件。詞法變量的作用域可以是一個函數(shù)或一段代碼宵蛀,該變量在這段代碼區(qū)域內(nèi)可見(visibility);在這段區(qū)域以外該變量不可見(或無法訪問)县貌。詞法作用域里术陶,取變量的值時,會檢查函數(shù)定義時的文本環(huán)境煤痕,捕捉函數(shù)定義時對該變量的綁定梧宫。【維基百科】

var global1 = 1  //全局變量
function fn1(param1){
  var local1 = 'local1'  //局部變量 
  var local2 = 'local2'  //局部變量
  function fn2(param2){
    var local2 = 'inner local2'  //局部變量
    console.log(local1)
    console.log(local2)
  }
  function fn3(){
    var local2 = 'fn3 local2'  //局部變量
    fn2(local2)
  }
  fn2() 
  //local1
  //inner local2
  fn3()
  //local1
  //inner local2
}
fn1()
詞法樹

詞法樹只能確定變量的關(guān)系摆碉,不能確定變量的值塘匣。

3.this和arguments

this 就是 call 的第一個參數(shù)!call 的其他參數(shù)統(tǒng)稱為 arguments
call才是正常的函數(shù)調(diào)用巷帝,其他調(diào)用函數(shù)的方式都是語法糖忌卤。

function f(){
  console.log(this)
  console.log(arguments)
}
f.call() // window,相當(dāng)于f.call(undefined)
f.call({name:'frank'}) // {name: 'frank'}, []
f.call({name:'frank'},1) // {name: 'frank'}, [1]
f.call({name:'frank'},1,2) // {name: 'frank'}, [1,2]

this 是隱藏的第一個參數(shù),且一般是對象楞泼,用于占位驰徊。arguments是偽數(shù)組历谍,第二到最后一個參數(shù)都放里面,如果只有一個參數(shù)就為[]辣垒。

4.call望侈、apply和bind

fn.call(asThis, p1,p2) 是函數(shù)的正常調(diào)用方式
當(dāng)你不確定參數(shù)的個數(shù)時,就使用 apply
fn.apply(asThis, params)

call 和 apply 是直接調(diào)用函數(shù)勋桶,而 bind 則是返回一個新函數(shù)(并沒有調(diào)用原來的函數(shù))脱衙,這個新函數(shù)會 call 原來的函數(shù),call 的參數(shù)由你指定例驹。

5.函數(shù)柯里化

函數(shù)柯里化就是只傳遞給函數(shù)一部分參數(shù)來調(diào)用它捐韩,讓它返回一個函數(shù)去處理剩下的參數(shù)。(返回函數(shù)的函數(shù))

//柯里化之前
function sum(x,y){
  return x+y
}
//柯里化之后
function addOne(y){
  return sum(1, y)
}
//柯里化之前
function Handlebar(template, data){
  return template.replace('{{name}}', data.name)
}
//柯里化之后
function Handlebar(template){
  return function(data){
    return template.replace('{{name}}', data.name)
  }
}

6.高階函數(shù)

在數(shù)學(xué)和計算機科學(xué)中鹃锈,高階函數(shù)是至少滿足下列一個條件的函數(shù):
a.接受一個或多個函數(shù)作為輸入:forEach sort map filter reduce,
b.輸出一個函數(shù):lodash.curry,
c.不過它也可以同時滿足兩個條件:Function.prototype.bind

7.回調(diào)函數(shù)

被當(dāng)做參數(shù)的函數(shù)就是回調(diào)函數(shù)(調(diào)用這個回調(diào))荤胁,回調(diào)跟異步?jīng)]有任何關(guān)系。

//同步回調(diào)
array.sort.call(array, fn)
array.forEach.call(array, fn)
array.map.call(array, fn)
array.filter.call(array, fn)
array.reduce.call(array, fn)
//異步回調(diào)
setTimeout(fn, 1000)

8.構(gòu)造函數(shù)

返回對象的函數(shù)就是構(gòu)造函數(shù)屎债,一般首字母大寫仅政。

new Number(1)
new String('s')

function Empty(){
  this.name = 'null'
  return this
}
var empty = new Empty  //Empty.call({})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市盆驹,隨后出現(xiàn)的幾起案子圆丹,更是在濱河造成了極大的恐慌,老刑警劉巖躯喇,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辫封,死亡現(xiàn)場離奇詭異,居然都是意外死亡廉丽,警方通過查閱死者的電腦和手機倦微,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來正压,“玉大人欣福,你說我怎么就攤上這事∶锵唬” “怎么了劣欢?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長裁良。 經(jīng)常有香客問我凿将,道長,這世上最難降的妖魔是什么价脾? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任牧抵,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘犀变。我一直安慰自己妹孙,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布获枝。 她就那樣靜靜地躺著蠢正,像睡著了一般。 火紅的嫁衣襯著肌膚如雪省店。 梳的紋絲不亂的頭發(fā)上嚣崭,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音懦傍,去河邊找鬼雹舀。 笑死,一個胖子當(dāng)著我的面吹牛粗俱,可吹牛的內(nèi)容都是我干的说榆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寸认,長吁一口氣:“原來是場噩夢啊……” “哼签财!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起废麻,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荠卷,失蹤者是張志新(化名)和其女友劉穎模庐,沒想到半個月后烛愧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡掂碱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年怜姿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼燥。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡沧卢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醉者,到底是詐尸還是另有隱情但狭,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布撬即,位于F島的核電站立磁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏剥槐。R本人自食惡果不足惜唱歧,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧颅崩,春花似錦几于、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至尖滚,卻和暖如春膝蜈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熔掺。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工饱搏, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人置逻。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓推沸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親券坞。 傳聞我的和親對象是個殘疾皇子鬓催,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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