Mam funkcję, aby wygenerować kilka liczb losowo-ish i wewnątrz tej funkcji, wykonuję połączenie do SetInterval (), ponieważ potrzebuję tych numerów, aby odświeżyć co 2 sekundy.

function genSine(val1, val2) {

    var freq = 0.1; // angular frequency

    var coords = function(x, y) {
        var amplitude = Math.floor((Math.random()*10)+1);
        var phase = Math.floor((Math.random()*20)+1);
        return {
            x : Math.sin(freq * (val1 + phase) * amplitude) + Math.floor((Math.random()*100)+1),
            y : Math.sin(freq * (val2 + phase) * amplitude) + Math.floor((Math.random()*100)+1)
        };
    }

    setInterval(function() {
        current = coords(50, 50);
        console.log('Val 1: ' + current.x);
        console.log('Val 2: ' + current.y);
    }, 2000);
}

genSine(10, 20);

Jest to dobrze i dobre, aktualizacja wartości zgodnie z oczekiwaniami, ale moim celem jest posiadanie dwóch zmiennych globalnych (nazywajmy ich aktualizacją VAL1 / VAL2) w tej funkcji SetInterval (). Wygląda na to, że mam problem z zakresu zakresu, ponieważ zmienne te nie są dostępne w zależności od funkcji i nie mogę uzyskać dostępu do "bieżącej" zmiennej z zewnątrz tej funkcji. Wiem, że czegoś tutaj tęsknię, co to jest?

Fiddle: http://jsfiddle.net/niczak/4unen/1/

2
Nicholas Kreidberg 26 listopad 2013, 02:14

3 odpowiedzi

Najlepsza odpowiedź

Wystarczy zdefiniować var current = {}; w globalnym zakresie i upewnij się, że nie w celu zdefiniowania var current w żadnym innym zakresie. current=[whatever]; jest w porządku, tak długo, jak nie ma var.

Edytuj: Nie jestem pewien, co zrobiłeś, ale naprawiłem twoje skrzypce z tym kodem:

var current;
function genSine(val1, val2) {

    var freq = 0.1; // angular frequency

   var coords = function(x, y) {
        var amplitude = Math.floor((Math.random()*10)+10);
        var phase = Math.floor((Math.random()*20)+10);
        return {
            x : Math.sin(freq * (val1 + phase) * amplitude) + Math.floor((Math.random()*100)+1),
            y : Math.sin(freq * (val2 + phase) * amplitude) + Math.floor((Math.random()*100)+1)
        };
    }

    setInterval(function() {
        current = coords(50, 50);
        console.log(current);
        $(".display").html(JSON.stringify(current));
    }, 500);
}

genSine(10, 20);

setInterval(function() {
    $(".display2").html("d2:"+JSON.stringify(current));
}, 200);
2
user1618143 25 listopad 2013, 22:35

Twoje current jest w porządku w tym zakresie, jest to funkcja coords, która nie jest w odpowiednim zakresie. Umieść, że w globalnym zakresie wraz z zmienną freq:

var freq = 0.1; // angular frequency
var coords = function (x, y) {
    var amplitude = Math.floor((Math.random() * 10) + 1);
    var phase = Math.floor((Math.random() * 20) + 1);
    return {
        x: Math.sin(freq * (val1 + phase) * amplitude) + Math.floor((Math.random() * 100) + 1),
        y: Math.sin(freq * (val2 + phase) * amplitude) + Math.floor((Math.random() * 100) + 1)
    };
}

function genSine(val1, val2) {

    setInterval(function () {
        current = coords(50, 50);
        console.log('Val 1: ' + current.x);
        console.log('Val 2: ' + current.y);
    }, 2000);
}

genSine(10, 20);
0
putvande 25 listopad 2013, 22:24

W maszynach wykonałem następujący kod. W poniższym kodem przypisuję _tis z wartością to

export class HomeComponent implements OnInit {
  lat: number = 22.008515;
  setMarker(){
   console.log('Inside setMarker Lat : '+this.lat); // 22.008515
    var _this = this;
    setInterval(function() {
     console.log('Inside setInterval this.lat : '+this.lat); // undefined
     console.log('Inside setInterval _this.lat : '+_this.lat); // 22.008515
    }, 8000)
  }
}
0
Renish Gotecha 18 luty 2019, 13:51