小记js中普通function和arrow function内this的使用区别

前两月参加内部培训的时候,遇到过一个关于arrow function中的this问题,

function Dog(name,variety) {
         Pet.call(this, name);
         this.variety =variety;
}

Dog.prototype = Object.create(Pet.prototype);


Dog.prototype.walk = function(){
         Pet.prototype.walk.call(this);
};

Dog.prototype.wang = function() {
         console.log(this.variety+" WangWang");
         Pet.prototype.shout.call(this);
};

在这段代码中,如果我把Dog.prototype.method = function(){}换成箭头函数,其他的不变,this.name就变成了undefined。当时使用nodejs和jsbin调试均是如此,

查了下此时arrow function中的this是global context,虽然知道这规则就是es6这样规定的,但是好奇心仍然得不到满足,今日偶然在知乎看见一个回答提到了更多信息。

原题是探讨关于this的缺陷的 ,其中 贺师俊 的回答提到:

 

1. JavaScript的this在直接调用时会是global,这是不是个错误?

答:是设计错误。所以ES5的strict模式改为了返回undefined。实际上曾有提案建议变为外层的this(也就是题主认为符合直觉的方式),但是这样的改变也存在问题。比如对于采用call/apply调用的函数,其this的行为总是应该和以前一样吧?所以,这样半吊子的lexical scoping其实反而增加了程序员的理解负担。

但是在ES6中,arrow function中的this确实变成了lexical scoping的,且arrow function不允许call/apply重新绑定this。参见



作者:贺师俊
链接:https://www.zhihu.com/question/20909497/answer/16589520
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

转载于:https://www.cnblogs.com/elanp/p/6958379.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值