1. 程式人生 > >javascript 中的函式

javascript 中的函式

/*   第二天   */

函式

函式是js裡最有趣的東西了,函式實際上就是物件,每個函式Function型別的例項,函式名實際上是指向函式物件的指標。不帶圓括號的函式時訪問函式的指標,帶圓括號的是呼叫函式

1.函式的表示

//1.函式宣告
function sum (num1, num2){ return num1 + num2; } //2.使用表示式與上面這種方法幾乎一樣 var sum = function(num1, num2){ return num1 + num2; } //已上函式就是將變數 sum 初始化為一個函式,還有最後一種方法
//3.使用Function建構函式,前面是任意量的引數最後一個引數是函式體
var sun = Function("num1", "num2", "return num1 + num2") //不推薦 會導致瀏覽器解析兩次程式碼,第一次是解析正常的js,第二次是解析傳入建構函式的字串

  函式宣告和函式表示式並非完全一樣,解析器在載入資料時會存在一個函式宣告提升的過程,會率先讀取函式宣告,至於表示式必須等到解析器執行到對應的程式碼,才會被解釋執行。

alert(sum(10, 10))
function sum (num1, num2){
  return num1+ num2;  
}//正常執行


alert(sum(10,10))
var sum = function(num1, mun2){
 return   num1 + num2;
}//報錯

  

 

 

 

 

2.引數

js中函式的引數是用一個類陣列物件表示(arguments),函式接收到的值始終是這個arguments,無論你傳入多少個引數進函式,都不會報錯。

舉例

function add(num1, num2){
  console.log(arguments) if(arguments.length == 1){ alert(num1 + 10); } else if(arguments.lentgh == 2){ alert(argument[0] + mun2) } }
add(1) // 11
add(1,2) // 3

//這是列印結果,我們發現arguments就是函式接收引數的類似於陣列的物件,我們可以通過這種方法來訪問函式的引數

  js中沒有函式過載這一概念只能通過上述方法來模擬過載,如果兩個命名相同的函式同時出現,後面的函式會直接覆蓋前面的函式,因為函式名字就是指向函式物件指標。

  arguments主要作用就是儲存函式的引數,但是他還有一個叫callee的引數,該屬性是一個指標指向擁有這個arguments物件的函式,在遞迴中消除緊耦合的現象。

3.作為函式值

函式名本身就是變數,所以函式也可以作為值來使用,不僅可以像傳遞引數一樣傳遞函式,也可以將函式作為值返回

例如我們在需要將一個物件陣列按照某個屬性進行排序,

//對這個物件陣列進行排序
var data = [
	{
		name:"wang",
		age:"23"
	},
	{
		name:"li",
		age:"18"
	},
	{
		name:"zhang",
		age:"20"
	}
]
//首先定義一個返回值為比較函式的函式
function createComparison (propertyName){
	return function(obj1, obj2){
		let value1 = obj1[propertyName]
		let value2 = obj2[propertyName]
		if(value1 > value2){
			return -1
		} else if(value1 < value2){
				return 1
		} else{
				return 0
		}
	}
}
console.log(data)//[{name: "wang", age: "23"},{name: "zhang", age: "20"},{name: "li", age: "18"}]
//利用sort()進行排序
data.sort(createComparison("age"))
console.log(data)//[{name: "wang", age: "23"},{name: "zhang", age: "20"},{name: "li", age: "18"}]

  這個例子中函式既作為引數又可以作為返回值,函式通過接收propertyName引數後,用方括號取得給定的屬性值,再定義比較函式

4.函式的內部屬性

函式的內部中有兩個特殊的物件, arguments和this,argunments我們之前討論過了,this的值就是函式執行環境的物件。

函式的屬性中有一個lenght表示函式希望接受命名引數的個數