ES6中箭头函数和箭头函数绑定this后指向问题

箭头函数

1.ES6 新增了一个使用(=>)箭头符号定义函数的语法特性,先来个最简单的;

let fn = name => name;
      console.log(fn('hec')); // hec
      
// 翻译成函数代码是这样的
let fn = function(name) {
        return name;
      };

2.箭头函数也可以传递两个或以上的参数,并实现运算后返回;

let fn = (x,y) => x + y;
        console.log(fn(10,20)); //30
        
// 翻译成函数代码是这样的
let fn = function(x,y) {
          return x + y;
        };

3.如果你定义的函数,并不需要传递参数,可以用()括号方式直接返回;

let fn = () => 'hec';
      console.log(fn()); //hec

// 翻译成函数代码是这样的
let fn = function() {
        return 'hec';
      };
      console.log(fn());

4.如果函数体需要更复杂的操作,可以将箭头符号右边使用传统函数体;

let fn = (x,y) => {
        return x + y;
      };
      console.log(fn(20,20)); //40

// 翻译成函数代码是这样的
let fn = function(x,y) {
        return x + y;
      };
      console.log(fn(50,50)); //100

5.如果箭头符号右边是对象返回的是对象,则需要用圆括号包含着;

let fn = name => ({name : name, age : 100});
      console.log(fn(name)); // {name : name, age : 100}
      console.log(fn('hec').name);  // hec
      
// 翻译成函数代码是这样的
let fn = function(name) {
        return {
          name: name,
          age: 100
        }
      };

6.如果箭头符号左边是对象作为参数,右边是对象的属性运算,也支持;

let fn = ({ name, age }) => name + ", " + age;
      console.log(fn({ name: "hec", age: 100 }));  // hec,100

// 翻译成函数代码是这样的
let fn = function({name,age}) {
        return name + "," + age;
      };

7.自我立即执行函数,也可以使用箭头符号来创建,具体如下:

((name) => {
        console.log(name);
      })('hec');  // hec

// 翻译成函数代码是这样的
(function (name) {
        console.log(name);
      })('hec');

总结:使用箭头函数 减少了function和return,使代码更加简洁了。

箭头函数绑定this

1.ES6 之前有一个比较头疼的问题,就是 this 指向的问题,比如下面例子:

<script>
let obj = {
        name: "hec",
        age: 18,
        fn: function () {
          setTimeout(function () {
            console.log(this.name + "," + this.age);
          }, 500)
        },
      };
      obj.fn();
</script>

2.上面的例子比较典型,this 全局指向 window,在某个对象内部指向当前对象;
3. 当 obj 对象下包含了类似 setTimeout 函数内部,这时 this 指向就出现问题了;
4. Web 环境下,它指向了 Window,而 node 环境下它指向 setTimeout;
5. 所以,我们通俗的做法,就是将 this 在 setTimeout 外部进行赋值保存

<script>

let that = this;

setTimeout(function () {
    console.log(that.name);
}, 500);

</script>

6.箭头函数的出现,彻底解决了 this 在内部指向的问题,直接指向我们所需要;
7.因为,箭头函数中的 this 是最外层定义的函数绑定,不受内部影响;

setTimeout(() => {
  console.log(this.name + ',' + this.age);
}, 500);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值