javascript 中的函式
阿新 • • 發佈:2018-12-02
/* 第二天 */
函式
函式是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表示函式希望接受命名引數的個數