第十章 函数
每个函数都是Function类型的实例,而Function也有属性和方法,跟其他引用类型一样。因为函数是对象,所以函数名就是指向函数对象的指针,而且不一定与函数本身紧密绑定。
使用
- 直接定义(有变量提升)
function funcName(args) {}
funcName(args)
- 字面量赋值(没有变量提升,包括 var)
let func = function (args) {}
func(args)
- 箭头函数
let func = (args) => {}
func(args)
- 使用 Function 构造函数创建(不推荐)
箭头函数的使用和正常函数差不多,胜在语法更简洁,但是箭头函数也有缺点,不能使用arguments、super和new.target,没有prototype,箭头函数的this指向也和普通函数的this指向不同。
所有函数默认自带一个只读属性:name,一般是返回函数名。没有名称则返回空字符串;如果是用构造函数创建的则返回 anonymous;如果函数是一个获取函数、设置函数,或者使用bind()实例化,那么会加上 bound 前缀
参数
ECMAScript函数的参数跟大多数其他语言不同。ECMAScript函数既不关心传入的参数个数,也不关心这些参数的数据类型。定义函数时要接收两个参数,并不意味着调用时就传两个参数。你可以传一个、三个, 甚至一个也不传,解释器都不会报错。
之所以会这样,主要是因为ECMAScript函数的参数在内部表现为一个 数组。函数被调用时总会接收一个数组,但函数并不关心这个数组中包含什么。如果数组中什么也没有,那没问题;如果数组的元素超出了要求,那也没问题。事实上,在使用function关键字定义(非箭头)函数时,可以在函数内部访问arguments对象,从中取得传进来的每个参数值。
这就是函数中自带的对象arguments,arguments对象是一个类数组对象,可以通过 [] 来访问参数,以及使用 length 获取长度
覆盖
重复命名函数,后面的会覆盖前面的函数的功能
function add(n1, n2) {
return n1 + n2
}
function add(n1, n2) {
return n1 + n1
}
add(3, 5) // 6
默认参数
es6以后,可以直接在参数后赋值默认值,而不用在函数内部判断该参数是否等于 undefined
运算符...
参数的传递可以使用...
,实参中使用表示将目标对象拆分成多个传递给函数,形参中使用表示将多个参数收集到该参数中
网友评论