# JS函数

# 定义函数

  • 具名函数
function 函数名(形式参数1,形式参数2){
    语句
    return 返回值
}
  • 匿名函数
let a = function(x,y){ return x+y }

注意fn2()作用域为 = 右侧

  • 箭头函数
let f1 = x => x*x
let f2 = (x,y) => x+y //
let f3 = (x,y) => {return x+y} //
let f4 = (x,y) => ({name:x, age: y})

在调用箭头函数时里面的this就是外面的this,里面没有自己的 this 箭头函数没有arguments

  • 构造函数
let f = new Function('x','y','return x+y')
# fnfn()区别:

fn为函数本身,fn()为函数调用

# 补充:立即执行函数

为了得到局部变量,先声明匿名函数并且在匿名函数前面加个运算符,然后加个()立即执行

//ES 5
!function(){
  var a = 1
  console.log(a)
}()
// ES 6
{
  let b = 2
  console.log(b)
}

# 函数要素

调用时机、作用域、闭包、形式参数、返回值、调用栈、函数提升、arguments、this

  • 调用时机
# Test1:输出结果为?6个6
let i = 0
for(i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

先执行for循环,循环结束后i值为6,过一阵之后执行setTimeout函数输出i;因为for循环6次,setTimeout函数执行6次,所以输出6个6

# Test2:如何使输出结果为0、1、2、3、4、5
//Method 1
for(let i = 0; i<6; i++){
  setTimeout(()=>{
    console.log(i)
  },0)
}

//Method 2
for(var i=0;i<6;i++){
    setTimeout(function(){console.log(i)}(),0)
}
  • 形式参数
function add(x,y){
  return x+y 
}
// x,y就是形参
add(1,2)
// 调用add函数时,1,2是实际参数,会被赋值给x,y
//下面代码近似等价于上面代码
function add(){
  var x = arguments[0]
  var y = arguments[1]
  return x+y
}
  • 返回值

每个函数都有返回值 只有函数有返回值 函数执行完毕后才会返回

函数hi没写return,所以返回值是undefined 函数hello的返回值为console.log('hi')的值,即undefined 函数fn的返回值为abc

  • 函数提升
add(1,2)
function add(x,y){
  return x+y 
}

无论把具名函数声明在哪,都会跑到第一行 let fn = function(){} 为赋值,等号右侧的函数声明不会提升