ES6新语法之---函数扩展(7)

这节学习ES6中对函数新增的方法和属性。

1.新增函数的参数默认值

参考S6系列第二篇:http://www.cnblogs.com/diweikang/p/8976854.html

2.新增了函数的rest参数

参考ES6系列第二篇:http://www.cnblogs.com/diweikang/p/8976854.html

3.length属性

  作用:获取函数预期传入的参数个数。

  指定默认值后,length属性将返回没有指定默认值参数的个数。

    (function (a) {}).length // 1
    (function (a = 5) {}).length // 0
    (function (a, b, c = 5) {}).length // 2

  注意:如果设置了默认值的参数不是尾参数,length属性也不再计入后面的参数。

    (function (a = 0, b, c) {}).length // 0
    (function (a, b = 1, c) {}).length // 1

4.严格模式

  严格模式是ES5中新增语法的,限制指定的代码在更严格的模式下执行。通常在脚本开头或函数头部添加"use strict"表达式来声明。

  <1>ES5开始,函数内部可以显示声明严格模式。

    function doSomething(a, b) {
      ‘use strict‘;
      // ...
    }

  ES2016中规定,只要函数中使用了参数默认值、解构赋值、或者扩展运算符,函数内部就不允许显示声明严格模式,否则报错。

    // 参数默认值
    function doSomething(a, b = a) {
         ‘use strict‘;
          // code
    }

    // 解构赋值
    const doSomething = function ({a, b}) {
      ‘use strict‘;
      // code
    };

    // 扩展运算符
    const doSomething = (...a) => {
      ‘use strict‘;
      // code
    };

    const obj = {
      // 解构赋值
      doSomething({a, b}) {
        ‘use strict‘;
        // code
      }
    };

  规定原因:函数内部声明的严格模式,限制函数参数和函数体都必须是严格模式执行。只有执行函数体的时候才能知道函数是否是严格模式,但是函数时先执行函数参数,再执行函数体的。这就导致参数如果不遵守严格模式,函数体中又显示声明严格模式,函数进行就会报错。

    // 严格模式八进制使用0o前缀表示
    function doSomething(value = 070) {
      ‘use strict‘;
      return value;
    }

  上面函数执行就会报错。

  如何规避这种限制:

    <1>、设定全局性的严格模式。

    ‘use strict‘;

    function doSomething(a, b = a) {
      // ...
    }

    <2>、把函数包装在一个无参数的立即执行函数里面。

    const doSomething = (function () {
      ‘use strict‘;
      return function(value = 42) {
        return value;
      };
    }());

5.name属性

  ES6新增函数的name属性,返回该函数的函数名。

  <1>将一个匿名函数赋值给一个变量,ES5的name属性会返回空字符创,ES6的name属性会返回实际的函数名称。

    var f = function () {};
    // ES5
    f.name // ""
    // ES6
    f.name // "f"

  <2>将一个具名函数赋值给一个变量,ES5和ES6的name属性都会返回这个具名函数的名称。

    const bar = function baz() {};
    // ES5
    bar.name // "baz"
    // ES6
    bar.name // "baz"

  <3>构造函数返回的函数实例,name属性值为anonymous

    (new Function).name // "anonymous"

  <4>将bind返回的函数,name属性值会加上bound前缀。

    function foo() {};
    foo.bind({}).name // "bound foo"

    (function(){}).bind({}).name // "bound "

6.箭头函数

  ES6允许使用"箭头"(=>)定义函数。

  <1>箭头函数需要一个参数

    var f = v => v;

    // 等同于
    var f = function (v) {
      return v;
    };

  <2>箭头函数不需要或者需要多个参数,使用括号将参数部分括起来。

    var f = () => 5;
    // 等同于
    var f = function () { return 5 };

    var sum = (num1, num2) => num1 + num2;
    // 等同于
    var sum = function(num1, num2) {
      return num1 + num2;
    };

  <3>箭头函数代码块多余一条语句,就要使用大括号括起来,并使用return语句返回。

    var sum = (num1, num2) => { return num1 + num2; }

  <4>如果箭头函数需要返回一个对象对象外面需要小括号括起来,否则会被当成代码块返回。

    // 报错
    let getTempItem = id => { id: id, name: "Temp" };

    // 不报错
    let getTempItem = id => ({ id: id, name: "Temp" });

  <5>如果箭头函数只有一行语句,且不需要返回值,可以采用下面的写法。

    let fn = () => void doesNotReturn();

  <6>箭头函数与变量解构结合使用。

    const full = ({ first, last }) => first + ‘ ‘ + last;

    // 等同于
    function full(person) {
      return person.first + ‘ ‘ + person.last;
    }

  <7>箭头函数与变量解构结合使用。

    const numbers = (...nums) => nums;

    numbers(1, 2, 3, 4, 5)
    // [1,2,3,4,5]

    const headAndTail = (head, ...tail) => [head, tail];

    headAndTail(1, 2, 3, 4, 5)
    // [1,[2,3,4,5]]

  注意:箭头函数没有自身的this对象。

    1.函数体中this对象,定义时所在的对象,不是函数调用时所在对象。

    2.不可以当构造函数,也就是不可以使用new命令。

    3.不可以使用arguments对象,该对象在箭头函数体内不存在。

  <8>箭头函数中的this对象

    function foo() {
      setTimeout(() => {
        console.log(‘id:‘, this.id);
      }, 100);
    }

    var id = 21;

    foo.call({ id: 42 });
    // id: 42

  上面代码中,setTimeout的参数是一个箭头函数,这个箭头函数的定义生效是在foo函数生成时,而它的真正执行要等到 100 毫秒后。如果是普通函数,执行时this应该指向全局对象window,这时应该输出21。箭头函数导致this总是指向函数定义生效时所在的对象(本例是{id: 42}),所以输出的是42

原文地址:https://www.cnblogs.com/diweikang/p/9388321.html

时间: 2024-08-01 21:29:21

ES6新语法之---函数扩展(7)的相关文章

总结常见的ES6新语法特性

总结常见的ES6新语法特性 ES6给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数(=>).class等等.用一句话来说就是: ES6给我们提供了许多的新语法和代码特性来提高javascript的体验 不过遗憾的是,现在还没有浏览器能够很好的支持es6语法,点这里查看浏览器支持情况,所以我们在开发中还需要用babel进行转换为CommonJS这种模块化标准的语法. 因为下面我会讲到一些es6新特性的例子,如果想要

ES6新特性(函数默认参数,箭头函数)

ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者false时,会直接取到后面的值,而不是传入的这个参数值. 那怎么解决呢?对于上图的代码,可以通过判断是否传入了num参数,没有就用默认值:   这种做法还是很麻烦的,而ES6则直接在参数定义里面设置函数参数的默认值,而且不用担心传入参数是0或者false会出错了: 2.箭头函数 箭头函数用 =>

ES6新语法之---对象字面量扩展、模板字符串(5)

这节课学习ES6中对象字面量扩展和新增模板字符串 第一部分:对象字面量扩展 1.简洁写法 ES6对于对象字面量属性提供了简写方式. 1.1:属性简写 //传统写法 var x = 2, y = 3, o = { x: x, y: y }; //ES6简洁写法 var x = 2, y = 3, o = { x, //属性名和赋值变量名相同时,可简写 y }; 1.2:方法简写 //传统写法 var o = { x: function() { //... }, y: function() { //

ES6新语法概览

简介 ES6是JavaScript语言的新一代标准,加入了一些新的功能和语法,正式发布于2015年6月,亦称ES2015:该标准由ECMA(欧洲计算机制造联合会)的第39号技术专家委员会(TC39)制订,ES7正在制订中,据称会在2017年发布. 语法 箭头函数.this ES6中可以使用 => 作为函数表达形式,极简风格,参数+ => +函数体. var foo = function(){return 1;}; //等价于 let foo = () => 1; let nums = [

总结常见的ES6新语法特性。

前言 ES6是即将到来的新版本JavaScript语言的标准,他给我们带来了更"甜"的语法糖(一种语法,使得语言更容易理解和更具有可读性,也让我们编写代码更加简单快捷),如箭头函数(=>).class等等.用一句话来说就是: ES6给我们提供了许多的新语法和代码特性来提高javascript的体验 不过遗憾的是,现在还没有浏览器能够很好的支持es6语法,点这里查看浏览器支持情况,所以我们在开发中还需要用babel进行转换为CommonJS这种模块化标准的语法. 因为下面我会讲到一

es6新语法

SegmentFault 头条 问答 专栏 讲堂 职位 活动 搜索 消息 注册 · 登录 home javascript php python java mysql ios android node.js html5 linux c++ css3 git golang ruby vim docker mongodb 文 es6语法快速上手 es6 javascript 奋进的小莫 2016年06月17日发布 推荐 2 推荐 收藏 44 收藏,6.5k 浏览 随着google和firfox以及no

ES6新语法(一)

1.常量         ES5没有定义声明常量的方式,ES6标准中引入了新的关键字const来定义常量.         常量必须给初始值: 常量不能在同一作用域内重新定义或赋值:  <script> const PI = 3.14; console.log(PI); </script> 2.块级作用域          JS中作用域有:全局作用域.函数作用域          ES6中新增了块级作用域.          块作用域由 { } 包括,if语句和for语句里面的{

ES6新语法(二)

1.解构         在ES6中,可以使用解构从数组和对象提取值并赋值给独特的变量,即将数组或对象中的值,拆成一个一个变量.         解构:自动解析数组或对象中的值,并赋值给指定的变量.. 1.1数组解构 var arr = [3,4,5]; var [a, b, c] = arr; console.log(a, b, c); //还可以忽略值 需要使用,占位 var arr = [3,4,5]; var [a,, c] = arr; console.log(a, c); //函数返

解构赋值 —— ES6新语法学习心得

## 3.解构赋值 ## 作用:将数组.对象.函数的参数 解构,对变量进行赋值,可以直接调用该变量,大大提高效率 ## 例 1: ##  标准模式的解构赋值 var [a,b,c]=[1,2,3] console.log(a) //1 console.log(b) //2 console.log(c) //3 ## 例2 : ##  嵌套解构赋值,只要"模式匹配",就能解构赋值,如果没有对应的值,就是undefined let [foo, [[bar], baz]] = [1, [[2