Zamiast tego za pomocą SetInterval mogę użyć tego, aby wielokrotnie nazwać funkcją.

function foo(){
    setTimeout(foo, 1000);
}();

Problem polega na tym, że chcę zrobić to samo, wewnątrz object, tutaj fragment.

var evt;
var init;

evt = function() {
    return {
        cycle:function(str) {
            setTimeout(function(str) {
                this.cycle(str);
            }, 1000);
        }
    }
}

init = new evt();
init.cycle("Hallo word");

Następnie pojawia się błąd, powiedział

Ten.cycle () nie jest funkcją.

Próbuję zrobić zmienną jako this w powyższej linii moich kodów, tutaj, podobnie jak to

var evt;
var init;

evt = function() {
    var parent;

    parent = this;
    return {
        cycle:function(str) {
            setTimeout(function(str) {
                parent.cycle(str);
            }, 1000);
        }
    }
}

init = new evt();
init.cycle("Hallo word");

Ale wciąż dostajesz.

rodzic.cycle () nie jest funkcją

Czy istnieje sposób, aby to zrobić, to, czego tu chcę, poszedłem, nazywam evt.cycle("Hello World") po pierwszej próbie wyświetlania Hello World Będzie powtórzyć Hello World w każdej kolejnej sekundach.

Muszę zachować funkcję wewnątrz obiektu, który generowany przez tę funkcję. Dzięki za każdą korektę.

0
Irvan Hilmi 25 luty 2019, 20:58

2 odpowiedzi

Najlepsza odpowiedź

Po powrocie nowego obiektu zdefiniowany jest nowy zakres. Więc powinieneś wiązać ten wskaźnik do funkcji. Lub możesz użyć funkcji .Bind (tej) w ten sposób:

setTimeout((function(str){ 
}).bind(this), 1000)

Aby uzyskać więcej informacji: HTTPS: // Deweloper. mozilla.org/en-us/docs/web/javascript/reference/global_objects/function/bind.

Lub można użyć połączenia lub zastosowania: HTTPS: //developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/function/call.

https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/function/apply.

W ES6 można użyć () => {} (strzałka) funkcja, gdy ten wskaźnik jest dziedziczony.

Inne rozwiązanie robocze:

var evt;
var init;

evt = function() {
    var parent;

    parent = this;
    return {
        cycle:function(str) {
            var me = this;
            setTimeout(function(str) {
                console.log("cycle");
                me.cycle(str);
            }, 1000);
        }
    }
}

init = new evt();
init.cycle("Hallo word");
1
tdev 25 luty 2019, 18:15

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this

const evt = function() {
  return {
    i: 0,
    cycle: function(str) {
      const _this = this;
      setTimeout(() => {
        console.log(str.substring(0, this.i));
        _this.cycle(str, ++this.i);
      }, 1000);
    }
  }
}

init = new evt();
init.cycle("Hello world");

Rozszerzyłem przykład, aby zilustrować efekt this trochę więcej.

1
manonthemat 25 luty 2019, 18:24