1. 當實際參數的個數與形式參數的個數不匹配時,不會導致錯誤。
如果實際參數值過多了,超出的參數值將被忽略;如果實際的參數值過少,缺失的值將被替換為undefined。
2. 在網頁特效中一共有四種調用模式: 方法調用模式、函數調用模式、構造器調用模式和apply調用模式。這些模式在如何初始化關鍵參數this上存在差異。
a.方法調用模式:
當一個函數被儲存為對象的一個屬性時,我們稱它為一個方法。方法調用模式可以使用this去訪問對象,所以它能夠從對象中取值或修改對象。
b.函數調用模式:
當一個函數並非一個對象的屬性時,它被當作一個函數來調用。當函數以此模式調用時,this被綁定到全域變數,這是語言設計上的一個錯誤。(正確的情況:當內建函式被調用時,this應該仍然被綁定到外部函數的this變數。)解決方案:如果該方法定義一個變數並給他賦值為this,那麼內建函式就可以通過那個變數訪問到this,按照約定,給那個變數命名為 that:
//給 myobject增加一個double方法
myobject.double = function()
{
var that = this; //解決方案
var helper = function()
{
that.value = add(that.value, that.value);
}
helper(); //以函數的形式調用helper。
}
//以方法的形式調用double
myobject.double();
c.構造器調用模式:
在一個函數前面帶上new來調用,那麼將建立一個隱藏串連到該函數的prototype成員的新對象,同時this將會被綁定到那個新對象上
//建立一個名為quo的建構函式。它構造一個帶有status屬性的對象
var quo = function(string)
{
this.status = string;
}
//給quo的所有執行個體提供一個名為get_status的公用方法
quo.prototype.get_status = function()
{
return this.status;
}
//構造一個quo執行個體
var myquo = new quo("confused"); //構造器模式調用
document.writeln(myquo.get_status());
構造器函數儲存在以大寫格式命名的變數裡。
d.apply調用模式:
apply方法接受兩個參數,第一個是將被綁定給this的值,第二個就是參數數組。它讓我們構建一個參數數組並用其去調用函數。
//構造一個quo執行個體
var myquo = new quo("confused"); //構造器模式調用
document.writeln(myquo.get_status());
//構建一個包含兩個數位數組,並將他們相加
add = function(a, b)
{
return a+b;
}
var anarray = [3, 4];
var sum = add.apply(null, anarray); //7
//構建一個包含status成員的對象
var statusobject = {
status: "a-ok"
};
//statusobject並沒有繼承自quo.prototype,但我們可以再statusobject上調用
//get_status方法,儘管statusobject並沒有一個名為get_status的方法。
var status = quo.prototype.get_status.apply(statusobject);
3. 參數:
當一個函數被調用時,會有一個預設的參數,就是 arguments “數組”。
//構造一個將很多值相加的函數
//注意該函數內部定義的變數sum不會與函數外部定義的sum產生衝突。
//該函數只能看到內部的那個變數。
var sum = function()
{
var i, sum=0;
for(i = 0; i < arguments.length; i+=1)
{
sum += arguments[i];
}
return sum;
};
document.writeln(sum(4, 8, 15, 16, 23, 42)); //108
註:arguments並不是一個真正的數組。它知識一個“類似數組”的對象。arguments用友一個length屬性,但它缺少所有的數組方法。
4. 返回:
一個函數總是會返回一個值。如果沒有置頂傳回值,則返回undefined。
如果函數以構造器方式被調用,且傳回值不是一個對象,則返回this(該新對象)。