2 回答

TA貢獻1946條經驗 獲得超4個贊
Function類型
函數實際上是對象,每個函數實際上都是 Function 類型的實例。而且與其他引用類型一樣具有屬性和方法。函數名實際上是一個指向內存堆中某個函數對象的指針。
定義函數的方式
1、函數聲明
function sum(num1,num2){ return num1+num2;
}
2、函數表達式
var sum=function(num1,num2){ return num1+num2;
};
定義了一個變量 sum 并將其初始化為一個函數,注意到 function 關鍵字后面并沒有函數名,這是因為在使用函數表達式定義函數,沒必要使用函數名,通過變量 sum 即可引用函數。還要注意函數末尾有個分號,就像聲明其他變量一樣。
new 構造函數,雖然這種用法也是函數表達式,但該用法不推薦。因為這種語法會導致解析兩次代碼(第一次是解析常規的ECMAScript代碼,第二次是解析傳入構造函數中的字符串),影響性能。
使用 Function 構造函數,構造函數可以接受任意數量的參數,但最后一個參數始終都被看成是函數體,前面的參數則枚舉出了新函數的參數。
var sum=new Function('num1','num2','return num1+num2;');
sum;// function anonymous(num1,num2/**/) {return num1+num2;
}
當使用不帶圓括號的函數名是訪問函數指針,而非調用函數。
擴展資料
1、ECMAScript中所有參數傳遞的都是值(即使是引用也是傳遞的地址值,不是引用傳遞參數(可參考 JavaScript傳遞參數是按值傳遞還是按引用傳遞))。
2、ECMAScript函數不介意傳遞進來多少個參數,也不在乎傳進來的參數是什么數據類型。之所以這樣,是因為ECMAScript中的參數在內部是用一個數組表示的。函數接收到的始終都是這個數組,而不關心數組中包含哪些參數。
3、在函數體內,可以通過 arguments 對象來訪問這個數組。從而獲取傳遞給函數的每個參數。
4、關于 arguments 的行為,它的值永遠與對應命名參數的值保持同步。因為 arguments 對象中的值會自動反映到對應的命名參數。
5、所以修改 arguments[1] ,也就修改了 num2 。不過這并不是說讀取這兩個值會訪問相同的內存空間,它們的內存空間是獨立的,但他們值會同步(WHY),要是JavaScript能直接訪問內存就好了驗證一下。
6、但如果只傳入了一個參數,那么 arguments[1] 設置的值不會反映到命名參數中,這是因為 arguments 對象的長度是由傳入參數個數決定的,不是由定義函數時的命名參數個數決定的,沒有傳遞值的命名參數將自動被賦予 undefiend 值,這就跟定義了變量但沒初始化一樣。
添加回答
舉報