函数实际上是对象,每个函数都是Function
类型的实例,Function
也有属性和方法,跟其他引用类型一样。因为函数是对象.所以函数名就是指向函数对象的实例。
Es6新增的胖箭头(=>) 任何可以使用函数的地方,都可以使用箭头函数
let arrFunction = (a,b) =>{
return a + b;
}
console.log(arrFunction(1,2));//3
如果只有一个参数可以不带括号。没有参数或多个参数的时候需要括号
let double = (x) => {return 2*x;};
let title = x =>{return 2*x};
因为函数名就是指向函数的指针,所以它们跟其他包含对象指针的变量具有相同行为,一个函数可以有多个名称。
function sum(sum1,sum2){
return sum1 + sum2;
}
console.log(sum(10,10));//20
let str = sum;
console.log(str(10,10));//20
sum = null;
console.log(str(10,10));//20
Es6
的所有函数对象都会暴露一个只读的name
属性。
js
函数的参数跟其他语言不通,它不会关心传入的参数个数,也不关心参数的数据类型。定义函数2个参数,调用不一定要接收两个参数。可以传一个、二个、三个,解析都不会报错。因为ECMAScript
函数的参数在内部表现为一个数组,函数被调用时总会接收一个数组,但函数不关心这个数组里面有什么或者是包含什么。或者什么也没有那也没有问题的。
(非箭头函数)时,可以在函数内部访问arguments
对象,从中取得传进来的每个参数的值。
arguments
对象是一个类数组(但不是Array
实例)比如:
function fn(){
console.log(arguments.length);
}
fn("string",45);//2
fn();//0
fn(12);//1
还有一点就是arguments
可以跟命名参数一起使用
function fn(a,b){
if(arguments.length === 1){
console.log(a + 10);
}else if(arguments.length === 2){
console.log(arguments[0] + b);
}
}
如果ECMAScript
定义了两个同名函数,后定义的会覆盖前面的。
function fn() {
alert(1)
}
function fn() {
alert(2) //2
}
fn();
可以通过检查参数的类型和数量,然后分别执行不同的逻辑来模拟重载。
let numInt = function(num){
return num + 10;
}
numInt = function(num){
return num + 20;
}
let result = numInt(1)
console.log(result);//21
在创建第二个函数时变量numInt被重写成保存的的第二对象。
ES6
之后支持显示定义默认值参数了,在参数后面用=
赋值即可