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(该新对象)。
首页 1 2 末页