前言
函數是一種封裝,在任何語言中都是一個核心概念。在js中,函數是做為對象的子類型存在的。可以擁有自己的屬性和方法,可以做為值進行傳遞,這兩個特性讓js擁有使用函數式編程的能力。
函數的聲明
字面量聲明:就是使用function關鍵字后面跟上固定語法。
function fnName(option1,option2){ // 這里是代碼塊 }
作為函數表達式:只要函數出現的地方,不是函數本身的function 關鍵字打頭的,都叫函數表達式。
// 作為函數表達式的函數
var fn = function(){}
函數的構成
形參:函數定義的時候在小括號里面定義的參數列表。用來接收實際參數。
實參:實際調用函數的時候傳入的參數。
return:結束函數執行的同時把后面 跟着的值返回出去,作為函數的產出。是可選的。不顯示返回參數的話執行后會默認返回undefined。
函數的執行:函數表達式后跟一對圓括號()就會執行。
作為對象的函數:js中的函數作為對象類型是可以擁有自己的屬性的。
// 一個做作的加法函數
function add(a,b){ return add.calculate(); } // 為作為對象的函數定義一個calculate屬性 這個屬性的值指向一個匿名的function。
add.calculate = function(){ let num = 0; Array.prototype.map.call(this.arguments,function(item){ num += item; }) return num; } console.log(add(1,3)); // 4
函數的兩個屬性
js中函數的形參和實際運行時傳入的實參個數可以是不對等的。默認的從左到右一一對應,多傳或少傳也不會報錯的。
arguments:可以在函數體內通過函數名訪問argument獲得函數運行時的實參列表。
length:可以獲取函數定義時,指定的形參個數。
使用arguments定義一個重載的函數(根據不同實參個數做不同操作,jq的重載從概念上是這么干的)
function getSum(){ // 獲取實參列表 var arg = getSum.arguments; // 沒有參數就直接返回 -1 if(arg.length === 0){return -1} // 只有一個參數就直接返回這個參數 if(arg.length === 1){ return arg[0]; } var sum = 0; Array.prototype.map.call(arg,function(item){ // item就是實參 sum += item; }) return sum; }