zoukankan      html  css  js  c++  java
  • 当下不可不知的es6箭头函数

     相信各位大侠对ES6并不陌生了,所以在此不再赘述它的历史与由来,直接进入正题。

     jQuery的这种写法可能已经被写烂了:

    $(".submit-btn").click(function(){
      ajax();
    });

     那么来个新鲜的:

    $(".submit-btn").click(() => ajax());

    第一次接触箭头函数的写法,似乎觉得无法理解,别急,我们先来了解一下ES6箭头函数的基本语法:
    ([param], [param]) => {
       statements
    }
    // param 是参数,根据参数个数不同,分这几种情况: 
    // () => { … }      零个参数用()表示function; 
    //  x => { … }      一个参数时可以省略(); 
    // (x, y) => { … }  多参数不能省略()

     看过语法后,是不是觉得箭头函数简洁明了,至少不用写function了,不会再出现因为function写成functoin而报错的尴尬了。那么箭头函数的好处仅此而已吗?如果仅仅如此,那当然是太肤浅了。

    当function函数体中只有一句return语句时,也可将return省略。
    // ES5
    var
    total = values.reduce(function (a, b) { return a + b; }, 0);

    // ES6
    var total = values.reduce( (a, b) => a + b, 0 );  // 两个参数a,b ,所以参数外层的 () 不可省略

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

    只有一些省略单词的功能吗?of course NO !

    对于传统function函数,都有属于自己的this值,使得内层函数的this值可能是window、undefined或者内层函数自身的对象,这也制造了不少麻烦,比如我们写过这段hack用来处理this的指向问题:
    // ES5
    {
      ...
       add: function(arr){
          var that = this;
          _.each(arr, function (item) {
          // 此函数里的this并不是可以调用add方法的对象,需要用that保存外层可以调用add方法的this对象

          that.add(item);
          })
      }
      ...
    }
    
    

    假如函数嵌套太深,this问题是很头疼的,此时轮到箭头函数登场了,箭头函数可以继承外围作用域的this值:

    // ES6
    {
      ... add(arr)
    => {

        
    // 这里的this继承自外层对象的this,而不是each方法中自己的this
        _.each( arr, item => this.add(item) )  
           }
      ... }

     在ES6的版本中,add方法从它的调用者处获取了this值,而其内部函数是一个箭头函数,所以该箭头函数继承了外围作用域的this值。


    另外,箭头函数还可以与ES6新特性“变量解构”结合使用,十分方便,想了解的请戳
    变量解构
    
    
    // ES5
      function full(obj) {
         return obj.name + ',' + obj.age;
      }
    // ES6   const full = ({ name, age }) => name + ',' + age;  // 只有一句代码所以省略return
    
    
    
    学习了箭头函数的几种基本用法,我来提几点需要注意的地方,防止大家在用的过程中踩雷。

    1、由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号,否则会报错。
    var getObj = id => ({ id: id, name: "objName" });
    var getObj = id => { id: id, name: "objName" };  // 报错
    
    

     

     2、箭头函数与非箭头function函数间有一个细微的区别,箭头函数没有它们自己的arguments对象。

    function showArgs() {
      setTimeout(() => {
        console.log('args:', arguments);
      }, 100);
    }
    
    showArgs(1, 3, 5)
    // args: [1, 3, 5]  这里的argments实际上是showArgs的arguments

     3、箭头函数不可当作构造函数,也就是说,不可以使用new命令,否则会抛出一个错误。原因是它没有属于自己的this。

     4、箭头函数无法使用call()、apply()、bind()等方法改变this指向,因为它并没有this值。

    (function() {
      return [
        (() => this.x).bind({ x: 'inner' })()
      ];
    }).call({ x: 'outer' });
    // ['outer'] 箭头函数的bind()方法无效



  • 相关阅读:
    source insight 4.0.086破解
    Java IO流关闭问题的深入研究
    iOS开发UI篇—UITableview控件使用小结
    iOS开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
    iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
    iOS开发UI篇—实现UItableview控件数据刷新
    iOS开发UI篇—使用嵌套模型完成的一个简单汽车图标展示程序
    iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)
    iOS开发UI篇—UITableviewcell的性能优化和缓存机制
    iOS开发UI篇—UITableview控件基本使用
  • 原文地址:https://www.cnblogs.com/Double-Zhang/p/5441703.html
Copyright © 2011-2022 走看看