函数的定义方式

1.通过Function构造函数

  1. let fun = new Function('参数','函数体')

2.声明函数

  1. function fun(参数){
  2. 函数体
  3. }

3.匿名函数赋值

  1. let fun = function(){}
  2. //注意:匿名函数的赋值生成的函数没有函数的提升

4.箭头函数

立即执行函数

函数表达式建立后立即执行的函数,立即执行函数的目的是为了函数体能的变量不会污染全局的变量,类似现在的模块化,以前没有模块化想的解决办法。并且暴露函数接口给全局使用

  1. (function(window){
  2. function show(){}
  3. function hide(){}
  4. window.jsfunction = {
  5. show,hide
  6. }//将函数内部的函数通过挂载在window上的对象的方式暴露出去
  7. })(window)//将window作为参数传递进函数体,

函数的参数

1.函数的形参和实参

形参是函数声明中定义的变量,而实参是函数调用传入的具体参数

  1. function fun(形参,形参){}
  2. fun( 实参,实参 )

2.函数的默认参数

函数参数如果没有传入参数则提供一个初始值,这就是参数的默认值

  1. function fun(url,timeout = 1000){}
  2. //timeout有默认值,当函数不传值,默认初始值为1000
  3. fun("url",undefined)//传入undefined,则默认没有传值,会显示初始值
  4. fun("url",null)//null是有效值,会作为timeout的值传入函数体

默认参数对arguments对象的影响

非严格模式下,命名参数的变化会同步更新到arguments对象中去,而在严格模式下,参数不管怎么变化都不会影响arguments对象。

  1. function fun(a,b){
  2. console.log(a === arguments[0])
  3. console.log(b === arguments[1])
  4. a = "a"
  5. b = "b"
  6. console.log(a === arguments[0])
  7. console.log(b === arguments[1])
  8. }
  9. fun("c","c")
  10. //非严格模式输出true true true true
  11. //严格模式下输出true true false false
  1. 但是默认参数的使用,使得arguments和参数分离,不管是不是严格模式下。
  1. function fun(a,b = "hello"){
  2. console.log(a === arguments[0])
  3. console.log(b === arguments[1])
  4. a = "a"
  5. b = "b"
  6. console.log(a === arguments[0])
  7. console.log(b === arguments[1])
  8. }
  9. fun("c")
  10. //输出 true false false false
  11. //arguments和参数分离了,argument是初始赋予的值,参数在函数体内如何变化不影响arguments的对象

默认参数表达式

参数是函数表达式,函数参数在没有实参传入式调用,并将返回的值传给函数

  1. function value(){
  2. return 5
  3. }
  4. function fun(a,b=value()){
  5. console.log(a,b)
  6. }
  7. fun(1,2)//默认参数传值了,则输出(1,2)
  8. fun(1)//没有传值,则输出(1,5)默认参数是函数调用之后的返回值
  1. 初次解析函数声明时不会调用参数中的函数表达式,当不传入参数时才会调用。使用函数调用结果作为默认参数时,要记得加小括号,不然默认参数就是函数的引用,而不是函数调用的结果<br />先定义的参数可以作为后定义的参数的默认值,但是后定义的参数不能作为先定义的参数的默认值
  1. function fun(a,b=a){
  2. console.log(a,b)
  3. }
  4. fun(1)//输出1,1
  5. function fun1(a=b,b){
  6. console.log(a,b)
  7. }
  8. //fun1(1,1)输出1,2
  9. //fun1(undefined,1)会抛出错误,在获取a的值时,由于b还没有定义。
  1. 函数参数有自己的作用域和临时死区(TDZ),与函数体中的作用域是各自独立的,函数参数的默认值是不可以访问函数体内的变量声明的

不定参数

…keys类似的参数为不定参数,该参数为一个数组,包含字他之后的所有参数。

  1. function fun(key,...keys){}
  1. 不定参数使用限制
  2. - 每个函数至多只能声明一个不定参数,而且一定要放在末尾,在他之后不能再声明参数,否则会报错
  3. - 不定参数不能再setter对象字面量中使用,因为setter中的参数有且仅有一个,但是不定参数代表的是有不限参数,所以会报错

构造函数

到es6的类里再待补充

箭头函数

1.箭头函数和普通函数之间的不同

  1. - **没有thissuperarguments、和new.target绑定**
  2. - **不能通过new关键字调用**
  3. - **没有原型**
  4. - **不可以改变this的绑定**
  5. - **不支持arguments对象**
  6. - **不支持重复的命名参数**