1.函数理解
函数是对象,函数名是指针,函数名仅仅是指向函数的指针
function sum(num1,num2) {
return num1+num2;
} //sum指向函数A
console.log(sum(10,10)); //20
var anotherSum = sum; //anotherSum也指向函数A
console.log(anotherSum(10,10)); //20
sum=null; //sum指向null,anotherSum不变,还是指向函数A
console.log(anotherSum(10,10)); //20
2.JavaScript中没有函数重载
首先,什么是函数重载呢---------维基百科中的解释
简单点来说,函数重载就是有相同函数名,不同参数列表的方法。
从js语言角度来说,是不支持重载的。
因为在js中:
- 函数默认有一个arguments数组对象的参数,传入参数的个数可以不确定
- 函数的实质是对象,函数名是指针
但是其实js中也可以实现重载,可以参考这个大神的文章。
好啦,我们现在再回到js中没有重载。若声明两个同名的函数,后面的函数会覆盖前面的函数。
function add(num) {
return num+100;
}
function add(num) {
return num+200;
} //覆盖了之前的add函数
var result=add(100);
3.函数声明与函数表达式
函数声明:
function sum(num1,num2) {
return num1+num2;
}
那下面这个就是 函数表达式 啦:
var sum = function(num1,num2) {
return num1+num2;
}
这里再把立即调用函数表达式也顺带说下~
立即调用函数表达式就是创建只使用一次的函数,并立即执行。
(function (num1,num2) {
var sum = num1 + num2;
console.log(sum);
})(1,2);
//立即调用函数表达式也可以是有名字的函数
(function sumFun(num1,num2) {
var sum = num1 + num2;
console.log(sum);
})(1,2);
函数声明与函数表达式的不同: 只有函数声明才有Hoisting(函数提升)
这是因为js解析器在处理上不同,函数解析器会率先读取函数声明,并使其在执行任何代码之前可用;而函数表达式必须等到解析器执行到它所在的代码行。才会真正的解释执行。
console.log(sum(10,10)); //20
//函数声明
function sum(num1,num2) {
return num1+num2;
}
console.log(sum1(20,20)); //会报错!!!
//函数表达式
var sum1 = function(num1,num2) {
return num1+num2;
};