函数的定义方式
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有默认值,当函数不传值,默认初始值为1000fun("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,1function 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对象**- **不支持重复的命名参数**
