函数的定义方式
1.通过Function构造函数
let fun = new Function('参数','函数体')
2.声明函数
function fun(参数){
函数体
}
3.匿名函数赋值
let fun = function(){}
//注意:匿名函数的赋值生成的函数没有函数的提升
4.箭头函数
立即执行函数
函数表达式建立后立即执行的函数,立即执行函数的目的是为了函数体能的变量不会污染全局的变量,类似现在的模块化,以前没有模块化想的解决办法。并且暴露函数接口给全局使用
(function(window){
function show(){}
function hide(){}
window.jsfunction = {
show,hide
}//将函数内部的函数通过挂载在window上的对象的方式暴露出去
})(window)//将window作为参数传递进函数体,
函数的参数
1.函数的形参和实参
形参是函数声明中定义的变量,而实参是函数调用传入的具体参数
function fun(形参,形参){}
fun( 实参,实参 )
2.函数的默认参数
函数参数如果没有传入参数则提供一个初始值,这就是参数的默认值
function fun(url,timeout = 1000){}
//timeout有默认值,当函数不传值,默认初始值为1000
fun("url",undefined)//传入undefined,则默认没有传值,会显示初始值
fun("url",null)//null是有效值,会作为timeout的值传入函数体
默认参数对arguments对象的影响
非严格模式下,命名参数的变化会同步更新到arguments对象中去,而在严格模式下,参数不管怎么变化都不会影响arguments对象。
function fun(a,b){
console.log(a === arguments[0])
console.log(b === arguments[1])
a = "a"
b = "b"
console.log(a === arguments[0])
console.log(b === arguments[1])
}
fun("c","c")
//非严格模式输出true true true true
//严格模式下输出true true false false
但是默认参数的使用,使得arguments和参数分离,不管是不是严格模式下。
function fun(a,b = "hello"){
console.log(a === arguments[0])
console.log(b === arguments[1])
a = "a"
b = "b"
console.log(a === arguments[0])
console.log(b === arguments[1])
}
fun("c")
//输出 true false false false
//arguments和参数分离了,argument是初始赋予的值,参数在函数体内如何变化不影响arguments的对象
默认参数表达式
参数是函数表达式,函数参数在没有实参传入式调用,并将返回的值传给函数
function value(){
return 5
}
function fun(a,b=value()){
console.log(a,b)
}
fun(1,2)//默认参数传值了,则输出(1,2)
fun(1)//没有传值,则输出(1,5)默认参数是函数调用之后的返回值
初次解析函数声明时不会调用参数中的函数表达式,当不传入参数时才会调用。使用函数调用结果作为默认参数时,要记得加小括号,不然默认参数就是函数的引用,而不是函数调用的结果<br />先定义的参数可以作为后定义的参数的默认值,但是后定义的参数不能作为先定义的参数的默认值
function fun(a,b=a){
console.log(a,b)
}
fun(1)//输出1,1
function fun1(a=b,b){
console.log(a,b)
}
//fun1(1,1)输出1,2
//fun1(undefined,1)会抛出错误,在获取a的值时,由于b还没有定义。
函数参数有自己的作用域和临时死区(TDZ),与函数体中的作用域是各自独立的,函数参数的默认值是不可以访问函数体内的变量声明的
不定参数
…keys类似的参数为不定参数,该参数为一个数组,包含字他之后的所有参数。
function fun(key,...keys){}
不定参数使用限制
- 每个函数至多只能声明一个不定参数,而且一定要放在末尾,在他之后不能再声明参数,否则会报错
- 不定参数不能再setter对象字面量中使用,因为setter中的参数有且仅有一个,但是不定参数代表的是有不限参数,所以会报错
构造函数
箭头函数
1.箭头函数和普通函数之间的不同
- **没有this、super、arguments、和new.target绑定**
- **不能通过new关键字调用**
- **没有原型**
- **不可以改变this的绑定**
- **不支持arguments对象**
- **不支持重复的命名参数**