【js】JavaScript函数,函数声明与函数表达式

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


猜你喜欢

转载自blog.csdn.net/amyleeymy/article/details/79441760