JavaScript的Function 類型
一,Function定義
Function實際上是對象,與其他引用類型一樣具有屬性和方法。Function可以通過三種方法進行定義,分別是函數聲明語法定義,函數表達式定義和Function構造函數定義。
1.函數聲明語法定義
function functionName(value1...){ //函數體 }
2.函數表達式定義
var functionName = function(value1...){ //函數體 }
3.Function構造函數定義
通過Function構造函數創建函數,可向構造函數中傳入任意數量的參數,但值得註意的是傳入的最後一個參數會作為函數體
var functionName = new Function("value",...,"函數體");
註:函數是引入值類型,所以函數名僅僅是指向函數的指針,當使用函數名去賦值給另一個變量名時,僅僅復制的是一個指針。即在下列a設置為null時,僅將a存的指針消除而已,不會影響b調用函數。
var a = b = function(value1){ return value1; } a = null; b(1);
二、函數的重載
函數本身是沒有重載的,因為在JavaScript中,函數可接收任意個參數,故不會因參數數量不同而發生函數重載。但可以通過特殊的寫法實現函數重載。
思路:利用函數內部屬性arguments.length去判斷,進行傳入不同參數的不同處理,從而實現函數的重載。
三、函數聲明與函數表達式的區別
解析器對這兩種定義函數方法的解析是不一樣的。解析器會將函數聲明的函數優先解析,使其在代碼執行前可用(函數聲明提前)。而函數表達式會在執行到該行代碼才會被解析。
四、閉包
面試題:將數組中的對象,按某個屬性進行排序。
思路:利用數組的sort()接收一個對比函數,該對比函數是另一個函數的返回值。
var arr = [{name:"lyf",age:20},{name:"gulu",age:18}]; function nameSort(name){ return function(obj1,obj2){ return obj1[name]-obj2[name]; } } arr.sort(nameSort("age"));
五、函數內部屬性
1.arguments:包含函數所有參數的偽數組。
其arguments.callee屬性指向含有該arguments對象的函數。該屬性可用於遞歸函數的函數調用。
例:一個階乘函數的寫法。
function factorial(num){ if(num<=1){ return 1; }else{ return num*arguments.callee(num-1); } }//好處:低耦合
2.this:函數執行的環境變量。
3.caller:調用當前函數的函數引用。
例:
function a(){ console.log(a.caller);//指向調用a的b } function b(){ a(); } b();
六、函數的屬性和方法
1.length:該屬性指定義函數時,需要傳入參數的個數。使用為:函數名.length;
2.prototype:原型函數。
3.apply和call:方法均改變調用函數的環境對象,簡而言之就是改變函數的this值。兩者除了傳入參數的方式不同外,沒有什麽區別。apply在傳參時,可傳入數組或偽數組arguments,call是將參數依次列出傳入函數的,具體看以下語法。
apply(環境對象,[value1,...])或apply(環境對象,arguments)。
call(環境對象,value1,value2...)
4.bind()
創建一個函數實例,其this值會被綁定到傳給bind()函數的值。
window.age = 20; var lizi = {age:18}; function sayAge(){ alert(this.age); } var say = sayAge.bind(lizi); say();//18
JavaScript的Function 類型