在 JS 中,函数不是数据类型,它属于 object 对象,是一种特殊的对象。
函数的声明
1. 具名函数
function命令声明的代码区块,就是一个函数。
function 函数名(形式参数1, 形式参数2){
语句
return 返回值
}
2. 匿名函数
具名函数去掉函数名,就是匿名函数。
let a = function(x, y) {
return x + y
}
将一个匿名函数赋值给变量,这时,这个匿名函数又称函数表达式,因为赋值语句的等号右侧只能放表达式。
采用函数表达式声明函数时,function命令后面不带有函数名。如果加上函数名,该函数名只在函数体内部有效(即函数作用域只能在 '=' 号右边),在函数体外部无效。
let a = function fn(x, y){
return x + y
}
fn(1, 2) //ReferenceError: fn is not defined
a(1, 2) //3
3. 箭头函数
let f1 = x => x * x
//两个以上参数时,圆括号不能省
let f2 = (x, y) => x + y
//函数体有两个语句以上时,花括号和 return 不能省
let f3 = (x, y) => {
console.log(x, y)
return x + y
}
//直接返回对象会出错,需要加个圆括号
let f4 = (x, y) => ( { name: x, age: y } )
4. 构造函数(用的少)
let add = new Function(
'x',
'y',
'console.log(\'hi\'); return x + y'
);
add(1, 2); //3
// 等同于
function add(x, y) {
console.log('hi');
return x + y;
}
上面代码中,Function构造函数接受三个参数,除了最后一个参数是add函数的“函数体”,其他参数都是add函数的参数。
这种声明函数的方式非常不直观,基本没人使用,但是能够知道函数是谁构造的。所有函数都是 Function 构造出来的,包括 Object、Array、Function。
函数自身 与 函数调用
1. 函数自身 fn
let fn = () => console.log('hi')
fn
上面代码不会有任何结果,因为 fn 没有执行。
2. 函数调用 fn()
let fn = () => console.log('hi')
fn()
fn() 会打印出 hi,有圆括号才是调用。
let fn = ()=>console.log('hi')
let fn2 = fn
fn2() //hi
上面代码中,fn保存了匿名函数的地址,这个地址被复制给了 fn2,fn2()调用了匿名函数,fn和fn2都是匿名函数的引用而已,真正的函数既不是fn也不是fn2。