天天看點

筆記-javascript(三)

筆記 javascript 函數

        • 函數
            • 函數聲明
            • 函數表達式
            • 匿名函數
            • 自執行函數
            • 一個簡單的狀态管理子產品(續)
        • 函數式程式設計
            • 函數是"一等公民"
            • 純函數(續)
            • 高階函數(續)
            • 柯裡化(續)
            • 代碼組合(續)

函數

函數聲明

利用關鍵詞function聲明一個函數,在變量的建立過程中,function聲明的函數比var聲明的變量執行順序具有更高的優先級。

函數表達式

函數表達式即将一個函數體指派給一個變量的過程。

var fn=function(){};
//等價于
var fn=undefined;
fn=function(){};
           

是以,使用函數表達式要考慮代碼的執行順序,以避免變量提升帶來的影響,這是與函數聲明不同的地方。

匿名函數

  1. 作為setTimeout中的參數
var timer=setTimeout(function(){
	console.log("延遲1s執行匿名函數");
},1000)
           
  1. 作為數組方法中的參數
var arr=[1,2,3];
arr.map(function(item){
	return item+1;
})
arr.forEach(function(item){
	//do something
})
           
  1. 作為一個傳回值
function add(){
	var a=10;
	return function(){
		return a+20;
	}
}
add()();
           

在實際開發中,當匿名函數作為一個傳回值時,為友善調試,常常給匿名函數添加一個名字。

自執行函數

(function(){
	//...
})();
           

一個簡單的狀态管理子產品(續)

函數式程式設計

//找出數組中所有類型為number的子項
//指令式程式設計
var array=[1,2,"a",4,"b","6"];
var res=[];
for(var i=0;i<array.length;i++){
	if(typeof array[i]==="number"){
		res.push(array[i]);
	}
}

//函數式程式設計
function getNumbers(array){
	var res=[];
	array.forEach(function(item){
		if(typeof item==="number"){
			res.push(item);
		}
	})
	return res;
}
           

函數是"一等公民"

也就是說,函數沒有什麼特殊的,我們可以像對待其它資料類型一樣對待函數。

我們可以将函數指派給一個變量、也可以将函數存在數組中、還可以将函數作為另一個函數運作的傳回值。

//糅雜寫法
function getUser(path,callback){
	return $.get(path,function(info){
		return callback(info);
	})
}
//調用
getUser(url,function(resp){
	console.log(resp);
})

//簡化1
function getUser(path,callback){
	return $.get(path,callback);
}
//簡化2
var getUser=$.get(path,callback);
           

純函數(續)

相同的輸入總會得到相同輸出,并且不會産生其他副作用。

function getLast(arr){
	return arr[arr.length];
}

function getLast_(arr){
	return arr.pop();
}

var last=getLast(source);	//傳回4,原數組不變
var last_=getLast_(source);	//傳回4,原數組最後一項被删除
           

一些javascript原生資料方法

//純
slice()、concat()、join()
//不純
splice()、pop()、push()、shift()、ushift()、reverse()
           

純函數另外一個特性,除傳入參數外,不依賴任何外界的資訊與狀态。

//依賴外界
var name=Jake";
function sayHello(){
	return "hello,"+name;
}
sayHello();

//不依賴外界
function sayHello(name){
	return "Hello,"+name;
}
           

是以,純函數具備可移植性和可緩存性(例)。

高階函數(續)

如果将目前函數看成基礎函數,那麼高階函數就是使目前函數獲得額外能力的函數。如果将構造函數看成基礎函數,那麼New方法就是構造函數的高階函數。New方法每次執行都會建立一個新的中間變量,并将中間對象的原型指向構造函數的原型,将構造函數的this指向該中間變量,這樣統一邏輯封裝就是高階函數的運用。

這裡放New方法及原型連結

數組map方法的封裝過程及思考(續)

使用者狀态的判斷邏輯封裝(續)

柯裡化(續)

柯裡化是指這樣一個函數,它接收函數A作為參數,運作後傳回一個新的函數,并且這個新的函數能夠處理A的剩餘參數。

在這裡插入代碼片
           

代碼組合(續)

繼續閱讀