一、純函數
給定一個輸入總是返回相同的輸出
var double = (value) => value*2;
二、高階函數
1.什麼是高階函數
函數能夠被存儲、傳遞並像JavaScript其他數據類型一樣被賦值,這種極端JavaScript特性允許函數被傳遞給另一個函數,我們稱爲高階函數,高階函數就是接受另一個函數作爲參數或返回一個函數的函數
const forEach = (array,fn) => {
let i;
for(i=0;i<array.length;i++)
fn(array[i])
}
2.數組中的高階函數
const every = (arr,fn) => {
let result = true;
for(const value of arr) {
result = result && fn(value);
}
return result;
}
const some = (arr,fn) => {
let result = false;
for(const value of arr) {
result = result || fn(value)
}
return result;
}
const map = (arr,fn) => {
let results = [];
for(const value of arr) {
results.push(fn(value));
}
return results;
}
const filter = (arr,fn) => {
let results = [];
for(const value of arr) {
(fn(value)) ? results.push(value) : undefined;
}
return results;
}
const reduce = (arr,fn,initialValue) => {
let accumlator;
if(initialValue != undefined) {
accumlator = initialValue;
}
else {
accumlator = array[0];
}
for(const value of arr) {
accumlator = fn(accumlator,value)
}
return [accumlator];
}
三、函數閉包
1.什麼是函數閉包
有權訪問另一個函數作用域鏈中的變量的函數,下例中函數inner就是閉包函數
function outer(){
let outer = "outer";
function inner{
console.log(outer);
}
return inner;
}
2.閉包的作用域鏈
- 在它自身之內聲明的變量
- 對全局變量的訪問
- 對外部函數變量的訪問(重點)
function outer(){
var result = new Array();
for(var i = 0; i < 10; i++){
result[i] = function(){
return i;
}
}
return result;
}
上例中result數組中的每個函數返回的都是10
四、柯里化與偏應用
1.函數柯里化
把一個多參函數轉化爲一個嵌套的一元函數的過程
function add(x,y){
return x+y;
}
add(1,2);
// 柯里化
function curryAdd(x){
return function(y){
return x+y;
}
}
curryAdd(1)(2);
const curry =(fn) => {
if(typeof fn!=='function'){
return;
}
return function curriedFn(...args){
if(args.length < fn.length){
return function(){
return curriedFn.apply(null, args.concat( [].slice.call(arguments) ));
};
}
return fn.apply(null, args);
};
};
2.偏應用
const partial = function (fn,...partialArgs){
let args = partialArgs.slice(0);
return function(...fullArguments) {
let arg = 0;
for (let i = 0; i < args.length && arg < fullArguments.length; i++) {
if (args[i] === undefined) {
args[i] = fullArguments[arg++];
}
}
return fn.apply(this, args);
};
};