JavaScript 函数(一)

233 阅读2分钟

在 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保存了匿名函数的地址,这个地址被复制给了 fn2fn2()调用了匿名函数,fnfn2都是匿名函数的引用而已,真正的函数既不是fn也不是fn2