# 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')
#
fn
与fn()
区别: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(){}
为赋值,等号右侧的函数声明不会提升