1. 函数的五种声明方式

以下是声明函数的五种方式,有常见的和不常见的,有ES3/5和ES6多种方式,同时还有几道很坑爹的面试题。

第一种具名函数:

function fn (input1,input2) {
    return undefined;
}

第二种匿名函数:

var fn = function (input1,input2) {
    return undefined;
}

第三种是面试中常考的,且很少人知道的写法,即具名和匿名函数的结合体:

// 虽然有fn2,但是不能直接调用和控制台输出fn2,只能通过fn1来进行访问函数体
var fn1 = function fn2(input1,input2) {
    return undefined;
}

// 下面会报错:
fn2() // Uncaught ReferenceError: fn2 is not defined

// 使用Function.prototype.name获取这种函数的名称就比较坑爹:
fn1.name // 输出"fn2"

第四种new实例化函数:

// 参数皆为字符串的形式
var fn = new Function('input1','input2','函数体');

// 也可以不加new,结果和加new一致
var fn = Function('input1','input2','函数体')

// 接上一种获取name的面试题,坑死人不偿命的题:
fn.name // 输出"anonymous" 果然是匿名函数

// 还有一道很多人都会错的面试题
var n = 1
var fn =  new Function('x','y','return x + ' + n + '+ y');
// fn(1,2)输入的结果为4, 因为n是数值1,函数生成前js会类型转换成字符串,然后做拼接之后进行后面的操作

第五种ES6新加的箭头函数:

// 箭头函数属于匿名函数,不能给函数本身加名字,只能保存为变量
const fn = (input1,input2) => {
    return undefined;
}
// 假如函数体只有一句,可以省略return和花括号
const fn = (input1,input2) => input1 * input2;