JavaScript中,每个函数都是Function类的一个实例。
也就是说每一个定义的函数名都是指向Function类型的一个实例。
函数名中存放的是函数的指针(Function类型实例指针)。
可以使用Function的构造函数实现,最后一个参数被视为函数体,如:
var sum = new Function("num1","num2","return num1+num2"); //不推荐
1.没有重载
因为函数名中存放的是指针,重新定义相同的函数名时,不管参数签名是否一致,都会覆盖掉之前所存的函数。
不存在重载。
但是函数的重载还是可以实现,JavaScript中,当函数传入的参数与函数签名数量不相同时,仍可以运行(在函数体中加入判断参数是否存在的语句,避免出错)。
这样也可以实现函数的重载。
2.函数声明与函数表达式区别
JavaScript在编译时会将函数的定义提前,即在调用之后才定义,也可以实现函数体的内容,如:
alert(sum(10,10); //输出20
function sum(num1, num2){
return num1 + num2;
}
而当使用函数的表达式时,编译到表达式时才会定义函数,因此如果像上例输出,会报错,如:
alert(sum(10,10); //unexpected identifier
var sum = function(num1, num2){
return num1 + num2;
}
3.作为值的函数
因为函数名中存放的是指针,因此函数可以作为一个参数传入另外一个函数内部,如:
function callSomeFunction(someFunction, someArgument){
return someFunction(someArgument);
}
function add10(num){
return num + 10;
}
var result1 = callSomeFunction(add10, 10);
alert(result1); //20
function getGreeting(name){
return "Hello, " + name;
}
var result2 = callSomeFunction(getGreet, "Nicholas");
alert(result2);
4.函数内部属性