函数是对象
1.定义一个函数
- 具名函数
具有名字的函数
function 函数名(形式参数1,形式参数2){
语句
return 返回值
}
- 匿名函数
去掉函数名就是匿名函数
let a = function(x,y){return x+y}
等式左边:声明一个变量a,并且把它赋值为
等式右边:函数表达式function(x,y){return x+y}
注意:a不是函数名,它只是一个变量保存了函数的地址
- 前两者结合
let a = function fn(x,y){ return x+y }
注意:如果函数的声明是在=
号右边,那这个fn
的作用域(作用范围),就只有在=
右边,出了这个范围fn
就不存在,其他地方要调用这个函数只能用a
。
如:
如果没有这个等于号,就是全局作用域,在哪里都可以用
- 箭头函数
let f1 = x => x*x
let f2 = (x,y) => x*y
1.箭头函数的左边就是输入参数,如果有两个输入参数就需要用括号把输入参数括起来
2.右边就是输出参数,如果输出参数有两句话,则需要加一个{}
和renturn
3.如果要直接返回一个对象
let f4 = x => ({name:x})
在{}
外边加一个()
,因为在JS中,{}
会优先被当做块,而里面的name:x
会被当成一个label
标签,加一个()
告诉JS是一个整体,才会当做对象
- 用构造函数构造(基本没人有)
所有函数都是Function
构造出来的,包括Object、Array、Function
2.函数自身 V.S. 函数调用fn V.S. fn()
执行就是调用的意思
- 函数自身
let fn = () => console.log('hi')
fn
结果:不会有任何结果,因为fn没有执行(调用),只是有个fn
- 函数调用
let fn = () => console.log('hi')
fn()
结果:打印出hi,有圆括号才是调用
- 进一步
let fn = () => console.log('hi') //fn保存了箭头函数的地址
let fn2 = fn //把fn保存的地址复制到fn2
fn2()
1.fn
保存了箭头函数的地址
2.把fn
保存的地址复制到fn2
3.fn2()
调用了匿名函数
4.fn
和fn2
都是匿名函数的引用而已
5.真正的函数既不是fn
也不是fn2
,而是=
右边那一块