理解Javascript函数形式参数与arguments
在JavaScript中,函数的形式参数和arguments之间存在着微妙的关系。为了深入理解这方面的知识,我们需要首先了解形式参数和实际参数的概念。形式参数指的是定义方法时所明确指定的参数,而实际参数则是指javascript实际调用时所传递的参数。arguments正是这些实际参数的集合体。
在函数say的定义中,我们可以看到有三个形式参数:msg、other和garbage,但是当我们调用say函数时,只传递了两个实际参数:'hello'和'world'。因此,arguments.length的值为2,而不是3。
arguments还有一个特殊的行为,那就是它会将所有的实际参数都当作对象来看待,对于基本数据类型的实际参数则会转换为其对应的对象类型。这可以通过在函数内定义与形式参数同名的变量并赋值来判断。在say函数中,我们可以看到arguments[1]的值首先是'world',然后变成了'nice to meet you!',这正是因为我们在函数内部定义了一个名为other的变量,并赋值为'nice to meet you!'。
在函数执行过程中,我们需要了解预解析的概念。在预解析阶段,函数声明的变量和函数内部定义的变量都会被处理。在say函数中,我们可以看到msg和other两个变量被预解析了,然后在函数内部再次定义了这两个变量,并赋值为'hello'和'nice to meet you!'。
需要注意的是,在函数内部定义与形式参数同名的变量是无意义的,因为在程序预解析后,这些变量将被看作为同一个变量。因此,在函数内部定义变量时,需要避免与形式参数同名,以免出现意外的结果。
arguments还有一些其他的特性,例如它可以作为一个伪数组来使用。这些特性将在《伪数组》一文中进行详细的解释。
理解函数形式参数和arguments之间的关系对于编写高效的JavaScript代码至关重要。只有通过深入理解这些概念,我们才能更好地控制函数的执行结果,并避免一些常见的错误。