JavaScript中每个函数均为Function类型实例,函数名本质是指向函数的指针。由于变量赋值机制,后声明的同名函数会覆盖前一个函数引用,导致ECMAScript原生不支持传统意义上的函数重载。
JavaScript函数与Function类型基础
在JavaScript语言体系中,存在一种特殊的数据类型——。该语言中的每一个函数实际上都是Function类型的实例对象。正因为函数被视为对象,所以函数名本质上只是一个指向函数对象的指针,它并不与特定的函数体进行固定绑定。
<pre name="code" class="html">function sum(num1,num2)
{
return num1 +num2;
}
alert(sum(10,10)); //20
var other = sum;
alert(other(10,10)); //20
sum = null;
alert(other(10,10)); //20
函数指针与重载机制的关系
理解函数名作为指向函数的指针这一概念,有助于解释为什么在ECMAScript标准中不存在传统意义上的函数重载机制。
function sum(num1)
{
return num1 +100;
}
function sum(num1)
{
return num1 +200;
}
alert(sum(200)); //400
同名函数覆盖现象解析
尽管代码中声明了两个同名函数,但后续定义的函数会覆盖前面的函数定义。上述代码逻辑等价于将第一个函数赋值给变量后,再重新赋值另一个函数的写法。
function sum(num1)
{
return num1 +100;
}
sum = function(num1)
{
return num1 +200;
}
alert(sum(200)); //400
当创建第二个同名函数时,实际上覆盖了原本指向第一个函数的变量引用,导致最终执行的是最后一个定义的函数逻辑。