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; };