随笔31-ES6函数的个人总结

ES6函数的个人总结

默认参数:

 1. 在 ES5 语法中,为函数形参指定默认值的写法:

写法一:

function foo (bar) {

    bar = bar || 'abc';

    console.log(bar)

}

foo('xyz')

写法二:

function foo (bar) {

    if (typeof bar === 'undefined') {

        bar = 'abc';

    }

    console.log(bar)

}

foo('xyz');

 2.  使用 ES6 的语法为函数形参指定默认值

function post (url, data = {}, timeout = 5 * 1000) {

      console.log(arguments)

      console.log(url, data, timeout)

    }

    // post('xyz', {uname: 'zhangsan', upass: '123'}, 3000);

    post('xyz', null, 3000);

注意事项:

  1> 除了为形参直接指定默认值以外,形参的默认值还可以是表达式,例如,timeout = 5 * 1000

  2> 在预编译阶段,形参表达式不会执行,只有在调用函数,并且没有为形参传递实参的情况下才执行

不定参数:

使用剩余操作符接收剩余的实参,这些实参会被保存到一个不定参数(args)中

function foo (...args) {

    return args.reduce(function (previousValue, currentValue) {

        console.log(previousValue, currentValue)

        return previousValue += currentValue;

    })

}

// 将上面的函数改成箭头函数的形式

var foo = (...args) => args.reduce((a, b) =>a += b)

console.log(foo(1, 32, 34, 5, 6))

箭头函数:

// 1. 形式一:

var foo = function () {

    return 'Hello World!';

};

// 如果形参数量为 0,则必须加上小括号。箭头后面的表达式的结果会被作为函数的返回值。

var foo = () => {

    return 'Hello World!';

}

// 2. 形式二:

var foo = function (greeting) {

    return greeting;

}

// 如果形参的数量为 1,则可以省略小括号。

var foo = greeting => {

    return greeting;

}

// 3. 形式三:

var foo = function (firstName, lastName) {

    return firstName + ' · ' + lastName;

}

// 如果形参数量大于 1,则不能省略小括号。

var foo = (firstName, lastName) => {

    return firstName + ' · ' + lastName;

}

// 4. 形式四:

var foo = function (a, b) {

    return a > b ? a : b;

}

// 如果函数的执行体比较简单(直接量或表达式),可以省略大括号,箭头后面的直接量或表达式会被自动作为返回值。

var foo = (a, b) => a > b ? a : b;

// 5. 形式五:

var foo = function (a, b) {

    let max = a;

    if (b > a) {

        max = b;

    }

    return max;

}

// 如果函数的执行体比较复杂,则不能省略大括号。

var foo = (a, b) => {

    let max = a;

    if (b > a) {

        max = b;

    }

    return max;

}

console.log(foo('赵四', '尼古拉斯'))

箭头函数没有this指定:

// 普通函数作用域中的 this 已经被绑定成 window 对象,因此当我们放问 this 时,直接在当前作用域下就能访问的到。

var foo = function () {

    console.log(this)

    return 'Hello World!';

};

// 箭头函数的作用域中没有绑定 this,因此,当我们访问 this 时,会去上一层作用域中查找 this。

var bar = () => {

    console.log(this)

    return 'Hello World!';

};

// 示例,由于 sayName 箭头函数中没有绑定 this,因此我们访问 this 时,会去全局作用域中查找。

// 查找的结果是 this 指向 window,因此输出的 name 的值是 '猪猪侠'

var name = '猪猪侠';

var obj = {

    name: '煎饼侠',

    sayName: function () {

        // this = obj

        return this.name;

    }

};

console.log(obj.sayName())

箭头函数没有arguments绑定:

// 普通函数

var foo = function (greeting) {

    console.log(arguments)

    return greeting;

};

// 箭头函数中没有绑定 arguments 对象,因此下面的输入语句会报错:arguments is not defined

var bar = (greeting) => {

    console.log(arguments)

    return greeting;

};

console.log(foo('Hello World!'))

console.log(bar('你好世界!'))

箭头函数中不能手动绑定this:

// this 指向的对象

var obj = {

    fullName: '沃尔玛'

};

// 1. 普通函数,可以使用 call() 方法改变函数中 this 的绑定

var foo = function (greeting) {

    return this.fullName + '说:' + greeting;

};

console.log(foo.call(obj, 'Hello World!'))

// 2. 箭头函数,不能使用 call() 方法改变函数中 this 的绑定,箭头函数中不能绑定 this。

var bar = (greeting) => {

    return this.fullName + '说:' + greeting;

};

// 下面的代码不会报错,但是也不起作用

console.log(bar.call(obj, '你好世界!'))

函数--new.target:

// 1. ECMAScript 5 中判断构造函数是否通过 new 关键字调用的写法

function Person (fullName) {

    if (this instanceof Person) {

        this.fullName = fullName;

    } else {

        return new Person(fullName);

    }

}

let student = Person('八戒')

// 2. ECMASript 6 引入一个 new.target 属性,当我们使用 new 操作符调用构造函数时,new.target 属性的值为构造函数,否则为 undefined

function Person (fullName) {

    if (typeof new.target !== 'undefined') {

        this.fullName = fullName;

    } else {

        throw new Error('必须通过 new 关键字来调用 Person。');

    }

}

let student = new Person('八戒');

console.log(student)

// 3. 除此之外,还可以检查 new.target 是否被某个特定构造函数所有调用。

// 例如,Person 构造函数中的 new.target 属性的值被限定为 Person

function Person (fullName, age) {

    if (typeof new.target === Person) {

        this.fullName = fullName;

        this.age = age;

    } else {

        throw new Error('必须通过 new 关键字来调用 Person。');

    }

}

function Dog (fullName, age) {

    Person.call(this, fullName, age)

}

let dog = new Dog('HeHe', 3)

console.log(dog)

// 4. 不能在函数外部使用 new.target,否则会报错

function Person () {

    console.log(new.target)

}

// 下面代码会抛出错误:new.target expression is not allowed here

console.log(new.target)

let student = new Person('悟净')

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容