1.定義
(1)匿名函數(shù)
(2)具名函數(shù)
(3)箭頭函數(shù),無this
詞法作用域(也叫靜態(tài)作用域)
JS看到上面的代碼不是立馬去執(zhí)行,而是去構造詞法樹,也就是一個函數(shù)能訪問那些變量在做詞法分析的時候就以及確定了。詞法作用域只能確定變量是那個變量,但是不能確定變量的值。call stack
(1) 普通調用 1+1+1
(2) 嵌套調用 1>2>3
(3) 遞歸this & arguments
(1) this 就是 call 的第一個參數(shù)!call 的其他參數(shù)統(tǒng)稱為 arguments
(2) this 是隱藏的第一個參數(shù),且一般是對象(如果不是對象,就顯得很沒有意義了)。那么this 為什么必須是對象?即使傳入的不是對象,比如是數(shù)字,也會被new Number一下,變成一個對象,因為 this 就是函數(shù)與對象之間的羈絆。call / apply
(1)fn.call(asThis, p1,p2) 是函數(shù)的正常調用方式。
(2)當你不確定參數(shù)的個數(shù)時,就使用 apply,fn.apply(asThis, params)
(3)也就是確定參數(shù)個數(shù)的時候使用call,不確定參數(shù)個數(shù)的時候使用apply,這也是它們倆的區(qū)別。比如當我們去遍歷一個數(shù)組求和,就算數(shù)組很小,但是使用call的話就如:sum.call(undefined, a[0],a[1],a[2]...),這個寫就顯得很智障了。
(4)若單獨的函數(shù)(fn)沒有依賴于對象,當調用fn.call()的時候,不傳參數(shù),this就是window,傳了參數(shù)this就是call的第一個參數(shù),一般不想指定this,可以使用undefined來占位,否則就會出現(xiàn)把我們想傳的參數(shù),默認第一個為this了。bind
call 和 apply 是直接調用函數(shù),而 bind 則是返回一個新函數(shù)(并沒有調用原來的函數(shù)),這個新函數(shù)會 call 原來的函數(shù),call 的參數(shù)由你指定。return
每個函數(shù)都有 return。如果你不寫 return,就相當于寫了 return undefined。柯里化 / 高階函數(shù)
(1)
//柯里化之前
function sum(x,y){
return x+y
}
//柯里化之后 ,類似于偏函數(shù)
function addOne(y){
return sum(1, y)
}
柯里化可以將真實計算拖延到最后再做:柯里化大多數(shù)是在模板引擎里面使用,大部分是用來惰性求值,如調用一個函數(shù)什么都沒做,就是return了一個函數(shù)。若對一個字符串做很重的操作,如正則,ajax,要是直接聲明就調用就顯得麻煩,那么就可以在真正使用的時候再去調用,如在第二次調用的時候才生效,這樣就是惰性求值。
(2)高階函數(shù):
在數(shù)學和計算機科學中,高階函數(shù)是至少滿足下列一個條件的函數(shù):
- 接受一個或多個函數(shù)作為輸入:如forEach sort map filter reduce。
- 輸出一個函數(shù):如lodash.curry。
- 不過它也可以同時滿足兩個條件:如Function.prototype.bind。
回調
名詞形式:被當做參數(shù)的函數(shù)就是回調,還有一個隱含條件就是,這個被當作參數(shù)的函數(shù)得call一下,這個call就是callback,若不call就不是callback了。
動詞形式:調用這個回調。
注意回調跟異步沒有任何關系。構造函數(shù)
返回對象的函數(shù)就是構造函數(shù),一般首字母大寫。