每个函数都是Function的实例,函数是对象,函数名实际上一个指向函数对象的指针,不会与某个函数绑定。
函数声明:
function sun(num1, num2){
return num1 + num2;
}
法二:使用函数表达式定义函数
var sun = function(num1, num2){
return num1 +num2;
}
法三:使用Function 构造函数定义
var sun = new Function('num1','num2','return num1+ num2'); //不推荐,其容易影响性能
函数名仅仅是指向函数的指针,故如下栗子:
function sum(a,b){
return a+b;
}
alert(sum(10,10)); //20
var anotherSum = sum;
alert(anotherSum(10,20)); //30
sum = null;
alert(anotherSum(10,20)) //30
没有重载
var sum = function(num){
return num +100;
}
var sum = function(num){
return num +200;
}
var rest = sum(100);
console.log(rest) //300
在创建第二个函数的时候,覆盖了引用第一个函数的变量 sum.
函数声明和函数表达式的区别
解析器在向执行环境加载数据的时候,优先读取函数声明;而函数表达式,等执行到其所在的代码行,才开始被执行。
举个栗子:
//函数声明
alert(sum(10,10))
function sum(a,b){
return a+b;
}
//函数表达式:用 var 变量来声明函数
alert(sum(10,10))
var sum = function(a,b){
return a+b;
}
补充说明:使用var 表达式定义函数, 只有变量声明提前了,变量初始化代码仍然在原来的位置
函数作为参数传递
ES中,函数名本身就是变量,所以函数可以作为值来使用。
举个栗子:无参函数的传递
function test1(Func){
Func();
}
function test2(){
alert("我是test2");
}
test1(test2); //我是test2
举个栗子:带参数的回调传递
var appendDiv=function(callback){
for(var i=0;i<10;i++){
var div =document.createElement('div');
div.innerHTML=i;
document.body.appendChild(div);
if(typeof callback=='function'){
callback(div);
}
}
}
appendDiv(function(node){
var num = parseInt(node.innerHTML);
if(num%2==0){
node.style.display='none'
}
});