zoukankan      html  css  js  c++  java
  • 小记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
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Java注解
    java反射简单入门
    java泛型反射
    BeanUtils.populate的作用
    适配器模式
    原型模式
    抽象工厂模式
    工厂方法模式
    建造者模式
    单例模式
  • 原文地址:https://www.cnblogs.com/elanp/p/6958379.html
Copyright © 2011-2022 走看看