初識function:
函數是由事件驅動的或者當它被調用時執行的可重複使用的代碼塊。
1、具名函數
var fun = function(){....}
此種方式變量會提升,函數體留原地。
function fun(){....}
此種方式變量函數體都會提升至最頂端,位於變量聲明提前之前。
2、匿名函數
setTimeout(function(){....}, 1000)
缺點:
- 追蹤棧中沒函數名,調試困難
- 如果需要引用自身,只能用arguments.callee(ES5嚴格模式禁用)
- 降低了函數可讀性、可理解性
3、立即執行函數
立即執行函數表達式用法:
//第一種
(function(){}());
//第二種
(function(){})();
4、頭等函數 、高階函數
函數接收函數作爲參數,並返回一個函數,例如:
5、一元函數
只接收一個參數的函數
6、偏函數
創造一個新函數,讓現有的一些參數值固定。比如bind實現偏函數:
function fun(a, b){
return a + b;
}
var test = fun.bind(null, 1);
test(2); // 3
6、柯里化函數
將一個多個參數的函數轉換爲幾個一元函數序列化的過程。例如:
//多個參數函數
function add(a, b){
return a + b;
}
//柯里化
function add(a){
return function(b){
return a + b;
}
}
7、純函數
返回值由其參數決定,沒有任何副作用的函數。
8、箭頭函數
- 沒有this,arguments
- 不能與new一起使用,不能通過bind改變函數體this指向
- 寫法更簡潔
- 性能更優
- 箭頭函數全是匿名函數
9、生成器
- function和函數名之間有一個*號
- 函數體內部使用了yield表達式
- yield和return一起使用的話,return後面的yield無效
- 沒有return,最後結果將是undefined
10、Function構造函數
- 由此種方式生成的函數,運行時,它們只能訪問自己的本地變量和全局變量,不能訪問Function構造器被調用生成的上下文的作用域。這和使用帶有函數表達式代碼的
eval
不同。 - 想要避免閉包,請考慮用它。
使用Function構造器生成的
Function對象是在函數創建時解析的。這比你使用函數聲明或者函數表達式(function)並在你的代碼中調用更爲低效,因爲使用後者創建的函數是跟其他代碼一起解析的
。