函数
函数实际上就是对象,而且每一个函数都是function类型的实例,函数通常以函数声明的方式来定义的。函数定义的最后是不需要添加分号的。
functionzss(a1,a2){returna1*a2}
如果我们使用定义函数的语法是函数表达式,函数表达式与函数声明几乎是一样的,这里的函数末尾是有分号的。:
letzss=function(a3,a4){returna3*a4};
我们还可以使用箭头函数来定义函数,箭头函数定义和函数表达式有点像:
letzss=(a5,a6)=>{returna5*a6;};
箭头函数当只有一个参数,可以省略括号不写,只要没有参数或者多个参数的情况下,才需要使用括号。当箭头函数没有使用大括号时,那么箭头后面只能有一行代码。箭头函数也有场景不能使用,比如arguments
、super
和new.target
,也不能使用构造函数。除此之外箭头函数也没有prototype
属性。如果函数是使用箭头函数语法定义的。我们传给函数的参数将不能使用arguments
关键字进行访问,而只能通过定义的命名参数访问。
functionzss(){console.log(arguments)}zss(7);//7letadd=()=>{console.log(arguments)}add(7)//ReferenceError:argumentsinnotdefined;
ECMAscript函数没有签名,因为参数是由包含0个或者多个值的数组表示的。没有函数签名自然也就没有重载。函数默认参数只有在函数被调用时才会求值,不会在函数定义时求值。箭头函数虽然不支持arguments对象,但是支持收集参数的定义方式。
JavaScript引擎在任何代码执行之前,会优先读取函数声明,并在执行上下文中生成函数定义。而且函数表达式必须等到代码执行到它的那一行才会执行上下文中生成函数定义。引擎也会把函数声明提升到顶部。
console.log(6,4);functionzss(a1,a2){returna1*a2}
上面代码这样写是没有问题的,因为函数声明会在任何代码执行之前先被读取并添加到执行上下文。而这个过程,我们叫作函数声明提升,如果我们是用定义函数的方式去写,就会出错。而且函数名在ECMAScript中是变量,所以函数可以用在任何可以使用变量的地方,这个意思就是说我们可以把函数作为参数传给另一个函数,而且还能在一个函数中返回另一个函数。