前言
函数实际上是对象,每个函数都是Function类型的实列,和其他引用类型一样Function也有属性和方法
箭头函数
ECMAScript 6新增了使用胖箭头(=>)语法定义函数表达式的能力
let arrowSum = (a, b)=>{
return a+b;
};
let functionExpressionSum= function(a, b) {
return a + b;
};
console.log(arrowSum(0,8)); //8
console.log(functionExpressionSum(100, 100)) //200
如果只有一个参数,那也可以不用括号。只有没有参数,或者多个参数的情况下,才需要使用括号
// 两种写法都有效
let double = (x) => {return 2 * x;};
let triple =x=> {return 3 * x;};
// 无参数需要括号
let getRandom = ()=>{return Math.random();};
// 多参数需要括号
let sum = (a, b) => {return a+b;};
// 无效的写法
let multiply = a, b => {return a * b;}; // 报错
函数名
因为函数名就是指向函数的指针,所以它们跟其他包含对象指针的变量具有相同的行为。一个函数可以有多个名称
function sum(num1, num2){
return num1 + num2;
}
console.log(sum(100,100)); //200
let anotherSum = sum;
console.log(anotherSum(100,100));//200
sum = null;
console.log(anotherSum(100, 100)); //200
使用不带括号的函数名会访问函数指针,而不会执行函数。此时,anotherSum和sum都指向同一个函数。调用anotherSum()也可以返回结果。把sum设置为null之后,就切断了它与函数之间的关联。而anotherSum()还是可以照常调用
ECMAScript 6的所有函数对象都会暴露一个只读的name属性,其中包含关于函数的信息。多数情况下,这个属性中保存的就是一个函数标识符,或者说是一个字符串化的变量名。即使函数没有名称,也会如实显示成空字符串。如果它是使用Function构造函数创建的,则会标识成”anonymous”
function foo(){};
let bar = function(){};
let baz = () =>{};
console.log(foo.name); //foo
console.log(bar.name); //bar
console.log(baz.name); //baz
console.log((()=>{}).name) //(空字符串)
console.log((new Function()).name) //anonymous
参数
ECMAScript函数的参数跟大多数其他语言不同。ECMAScript函数既不关心传入的参数个数,也不关心这些参数的数据类型。定义函数时要接收两个参数,并不意味着调用时就传两个参数。你可以传一个、三个,甚至一个也不传,解释器都不会报错
ECMAScript函数的参数在内部表现为一个数组。函数被调用时总会接收一个数组,但函数并不关心这个数组中包含什么
arguments对象是一个类数组对象(但不是Array的实例),因此可以使用中括号语法访问其中的元素(第一个参数是arguments[0],第二个参数是arguments[1])。而要确定传进来多少个参数,可以访问arguments.length属性
function sayHi(name, message){
console.log("hello" + name + "," +message);
}
可以通过arguments[0]取得相同的参数值。因此,把函数重写成不声明参数也可以
function sayHi(name, message){
console.log("hello" + arguments[0] + "," +arguments[1]);
}
在重写后的代码中,没有命名参数。name和message参数都不见了,但函数照样可以调用。这就表明,ECMAScript函数的参数只是为了方便才写出来的,并不是必须写出来的。与其他语言不同,在ECMAScript中的命名参数不会创建让之后的调用必须匹配的函数签名。这是因为根本不存在验证命名参数的机制
通过arguments对象的length属性检查传入的参数个数
function howManyArgs(){
console.log(arguments.length);
}
howManyArgs("string", 100) //2
howManyArgs(); //0
howManyArgs(12) //1
原创文章,作者:wdmbts,如若转载,请注明出处:https://blog.ytso.com/272857.html