JavaScript中函数也是对象,每一个函数的实例对象都是Function类型,有属性和方法
箭头函数
箭头函数在一个参数时可以不写小括号,0个或者多个需要写小括号。
箭头函数句法很简单,但有几种情况不适用
1、不允许使用参数,super 或者new.target
2、不能够被调用类似构造函数的形式调用
3、除此之外函数对象被创建是不能挂载到prototype
普通函数
函数名
函数名就是一个普通指针指向函数,类似变量持有指针指向一个对象。这意味着可以有有多个函数名指向同一个函数。
所有函数对象在ES6中,暴露一个只读的name属性,描述函数,在许多情况下,只是函数的标识,如果一个函数是没有名的,则会报告anonymous。
理解参数
JavaScript的函数的参数与别的语言不同,不限制传入参数的个数和类型,哪怕定义了个只有两个参数的函数,也可以传入任意个参数。
这种不同是由于JavaScript内部接收参数是类似数组形式的对象,但不是数组的实例,函数不会在意数组内部传过来的东西。
(JavaScript没有方法签名)
箭头函数内部的参数
箭头函数内部通过arguments[]访问参数,会报引用错误arguments未定义,尽管箭头函数不能使用arguments访问参数,但是在普通函数嵌套箭头函数中可以访问arguments,可以由上一层函数作用域提供给箭头函数。
注意:所有的JavaScript传递参数都是值传递,不是引用传递,如果一个对象被作为参数传递,那传的只是指向的对象引用。
没有重载
JavaScript的函数没有重载,主要原因有:
1、没有函数签名
2、参数可以传递任意个,哪怕定义时写了参数的个数
参数默认值
ES6标准之前参数提供默认值为undefined,ES6标准之后参数不再提供默认值。
函数声明与函数表达式
区别:主要是加载进资源树的时机不同,函数声明在所有代码执行前就可以使用,而函数表达式在没有执行到这一行,前面都不能使用。
实测效果
console.log(sum(50, 50));
function sum(param1, param2) {
return param1 + param2
}
console.log(sum1(10, 20));
let sum1 = function (param1, param2) {
return param1 + param2
}
this
在标准函数的内部,this是函数正在操作上下文对象的一个引用,如果函数是作用域是全局的,那么this对象指向window对象。
在箭头函数内部,this引用了箭头函数表达式的上下文,this引用上下文被保留。
简单来说:
普通函数谁调用,this就指向谁,箭头函数中的this指向父级上下文
函数的对象和方法
在JavaScript中函数也是对象,那么函数也同时有对象该有的东西——属性和方法。
属性包含两个:length和prototype
length是指的函数有名字参数的个数
prototype是所有引用类型的实例方法的实际位置,例如toString()方法就是存在在对象实例的prototype上。
函数里面的两个方法:apply()和call()
这两个方法共同调用函数,通过this这个特殊的值,有效的设置this这个对象的值。
apply()方法可以接收两个参数:1.函数中this的值 2.参数的数组
call()方法表现的行为与apply()方法一样,但是传递的参数不一样,第一个参数仍然是this的值,但是其余的参数则直接传递给函数
函数表达式
普通函数都有定义提升,无论调用在哪里,只要写了定义,定义就会提升到最前面,调用没有任何问题。如果函数表达式在定义之前调用,就会报错。
函数表达式定义的函数是匿名函数,在function关键字之后并没有函数名,函数的name属性也是空字符串。