一,Function定義面試
Function其實是對象,與其餘引用類型同樣具備屬性和方法。Function能夠經過三種方法進行定義,分別是函數聲明語法定義,函數表達式定義和Function構造函數定義。數組
1.函數聲明語法定義閉包
function functionName(value1...){ //函數體 }
2.函數表達式定義app
var functionName = function(value1...){ //函數體 }
3.Function構造函數定義函數
經過Function構造函數建立函數,可向構造函數中傳入任意數量的參數,但值得注意的是傳入的最後一個參數會做爲函數體,而其餘參數則做爲參數傳入函數中。用該方法去定義函數是不推薦使用的,由於該語法會致使解析兩次代碼,第一次解析常規ECMAScript代碼,第二次解析傳入構造函數的字符串,影響性能。性能
var functionName = new Function("value",...,"函數體");
注:函數是引入值類型,因此函數名僅僅是指向函數的指針,當使用函數名去賦值給另外一個變量名時,僅僅複製的是一個指針。即在下列a設置爲null時,僅將a存的指針消除而已,不會影響b調用函數。this
var a = b = function(value1){ return value1; } a = null; b(1);
2、函數的重載spa
函數自己是沒有重載的,由於在JavaScript中,函數可接收任意個參數,故不會因參數數量不一樣而發生函數重載。但能夠經過特殊的寫法實現函數重載。prototype
思路:利用函數內部屬性arguments.length去判斷,進行傳入不一樣參數的不一樣處理,從而實現函數的重載。指針
3、函數聲明與函數表達式的區別
解析器對這兩種定義函數方法的解析是不同的。解析器會將函數聲明的函數優先解析,使其在代碼執行前可用(函數聲明提早)。而函數表達式會在執行到該行代碼纔會被解析。
4、閉包
面試題:將數組中的對象,按某個屬性進行排序。
思路:利用數組的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"));
5、函數內部屬性
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();
6、函數的屬性和方法
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