Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Uncaught TypeError: Illegal invocation

Olá!

Por que exatamente não consigo mudar o contexto de window.setInterval nesse código?

class Relogio {
    constructor(){
        this._segundos = 0; 

        setInterval(function() {
            console.log(++this._segundos)
        }, 1000);
        Reflect.apply(setInterval , this, []);
    }

}

var r = new Relogio();

Pelo que pesquisei o erro acontece porque a funcão perde o contexto, mas não entendi o por que.

Obrigado.

1 resposta
solução!

Boa noite, Dorô! Como vai?

Quem perde o contexto não é o setInterval() e sim a função que vc está passando pra ele. Para solucionar esse problemas vc pode usar arrow functions que é um recurso que surgiu no ES6 justamente pra resolver questões assim ou então usar o método bind(). Segue um código para exemplificar essas possibilidades.

// Com arrow function

class Relogio {
    constructor(){
        this._segundos = 0; 

        setInterval(() => {
            console.log(++this._segundos);
        }, 1000);
    }

}

var r = new Relogio();

Obs.: Como a arrow function tem apenas uma linha de código, ainda poderiam ser omitidas as chaves que definem o corpo da função e o ponto e vírgula ao final da única instrução console.log().

// Com bind()

class Relogio {
    constructor(){
        this._segundos = 0; 

        setInterval(function () {
            console.log(++this._segundos);
        }.bind(this), 1000);
    }

}

var r = new Relogio();

Pegou a ideia? Qualquer coisa é só falar!

Grande abraço e bons estudos!