JavaScript - 带有箭头函数的超时内部[重复]

Posted

技术标签:

【中文标题】JavaScript - 带有箭头函数的超时内部[重复]【英文标题】:JavaScript - this inside of timeout with arrow functions [duplicate] 【发布时间】:2017-03-10 12:38:53 【问题描述】:

为什么setTimeout中的this不等于使用箭头函数时调用渲染函数的对象?

 class X 
      constructor(config) 
        this.data = config.data;
        this.render_ = config.render;
      
      render() 
        this.render_(this.data);
      
    
    var x = new X(
      data: [1, 2, 3],
      render: (data) => 
        setTimeout(() => 
          console.log(this);
        , 200);
      
    );
    x.render();

【问题讨论】:

【参考方案1】:

阅读arrow function documentation 中“箭头函数用作方法”的部分

总结:箭头函数只是简单地不绑定this 或它们自己的this 版本,而是引用全局Window 对象。

【讨论】:

这个问题似乎是关于this,而不是arguments 更新了@FelixKling 我在看上面的部分:')【参考方案2】:

因为arrow functions 是词法绑定的。这意味着它们在声明时具有“this”的价值。它们不受修改this 值的其他方式的影响,包括作为bindapplycall 等方法或函数调用。

function F() 
  this.type = 'F';
  this.logTypeExpression = function() 
    console.log(this.type);
  ;
  this.logTypeArrow = () => 
    console.log(this.type);
  ;


function G() 
  this.type = 'G';


var f = new F();
var g = new G();

f.logTypeExpression(); // F
f.logTypeArrow(); // F

// Now lets give these functions to G
g.logTypeExpression = f.logTypeExpression;
g.logTypeArrow = f.logTypeArrow;

g.logTypeExpression(); // G
g.logTypeArrow(); // F(!) (That's because `this` was assigned by the arrow function)

【讨论】:

【参考方案3】:

在创建箭头函数时,this 没有绑定到任何对象,所以它仍然引用window。如果您想引用该特定实例,也许您想尝试console.log(x);

【讨论】:

这应该是一个评论,充其量。问题是this 没有引用x 对象。【参考方案4】:

下面的代码仅包含对您使用对象文字语法创建的函数的引用。

this.render_ = config.render;

使用 bind(this) 将告诉函数在 X 对象的实例中调用函数时使用参数对象作为 this 引用。

class X 
    constructor(config) 
        this.data = config.data;
        this.render_ = config.render.bind(this);
    
    render() 
        this.render_(this.data);
    

此外,在您的代码 sn-p 中,它是箭头函数还是正则函数表达式都没有关系。

【讨论】:

以上是关于JavaScript - 带有箭头函数的超时内部[重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript箭头函数问题,语法问题

Javascript 箭头函数简述

这是箭头函数内部未定义的

带有警告的 PHP/Javascript 会话超时

JavaScript 学习-8.JavaScript 箭头函数的使用

带有箭头函数的打字稿重载方法