1函数参数一个函数的实参和形参的个数可以不同。这样做的原因是在ECMAScript中参数在内部表示为一个数组。该函数始终接收此数组,无论数组中包含哪些参数(如果有)。如果实参个数大于形参个数,多余的实参不会传值,但可以在arguments中访问;如果形参个数大于实参个数,没有传值的实参会自动赋值undefined。2arguments和this所有函数调用都会传递两个隐式参数:arguments和this。实际上,可以通过函数体中的arguments对象访问参数数组,从而获取传递给函数的每一个参数。arguments对象就像一个数组(它不是Array的实例),因为您可以使用方括号语法访问它的每个元素(arguments[0]、arguments[1]...),并且还可以使用length属性决定传入参数的数量。arguments对象的值总是与相应命名参数的值同步:functiondoAdd(num1,num2){arguments[1]=10;alert(arguments[0]+num2);}因为arguments对象中的值会自动反映在对应的具名参数中,所以修改arguments[1]也会修改num2,结果它们的值都会变成10.但是,并不是说读取两个值访问的是同一个内存空间;它们的内存空间是分开的,但是它们的值是同步的。还要记住,如果只传入一个参数,则为arguments[1]设置的值将不会反映在命名参数中(num2保持未定义)。这是因为arguments对象的长度是由传入的参数个数决定的,而不是由定义函数时命名参数的个数决定的。这个参数指的是函数的上下文。函数上下文来自Java等面向对象的语言。这在Java中取决于函数声明。但与Java不同的是,JavaScript中的this取决于函数的调用方式,因此将this称为调用上下文比较合适。一般函数的调用方式有四种:简单函数调用;对象方法调用;作为构造函数调用;通过apply()和call()调用。这四种方法的主要区别在于调用上下文不同:简单函数调用的上下文是窗口对象,方法调用的上下文是对象,构造函数的上下文是新创建的对象实例。这些调用中函数的this点是固定的,但只有apply()和call()调用可以独立定义上下文。3apply()/call():在特定范围内调用一个函数。区别在于参数的接收方式:apply(argu1,argu2),argu1是函数操作的作用域(this),argu2是参数数组,可以传入arguments对象或参数数组;call(argu1,argu2),argu1是this,argu2是一一列出的函数参数。如果打算直接传入arguments对象,或者included函数先接收一个数组,使用apply()肯定更方便;否则,call()可能更合适。(只要不向函数传递参数,使用哪种方法都没有关系。)传递参数并不是apply()和call()真正有用的地方;它们的真正力量在于扩大职能运作的范围。使用call()(或apply())扩展作用域的最大优点是对象不需要与方法有任何耦合关系。当需要为函数指定上下文时,就需要使用apply()和call()。一个具体的例子是回调函数。如果对数组中的每一个元素进行操作,命令式编程方式一般使用for循环遍历数组元素,而函数式编程则是写一个函数,然后对每个数组元素运行该函数。不同的是,函数式编程更方便代码复用。有两种方法可以为每个数组元素运行此函数。一种是将数组元素作为参数传入,另一种是将数组参数作为函数运行的上下文。在这种情况下,可以使用apply()和call()。functionforEach(list,callback){for(varn=0;n
