2 回答

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