在setInterval()中访问全局变量

时间:2013-11-25 22:14:17

标签: javascript jquery

我有一个函数来生成一些随机数字,在函数内部我调用setInterval(),因为我需要每2秒刷新一次这些数字。

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);

这一切都很好,价值按预期更新,但我的目标是在该setInterval()函数中有两个全局变量(让我们称之为val1 / val2)更新。看来我有一个范围问题,因为这些变量在函数中是不可访问的,我无法从该函数外部访问'current'变量。我知道我在这里错过了一些东西,它是什么?

小提琴:http://jsfiddle.net/niczak/4uNen/1/

3 个答案:

答案 0 :(得分:2)

您只需在全局范围内定义var current = {};,并确保在任何其他范围内定义var currentcurrent=[whatever];很好,只要没有var

编辑:我不确定你做了什么,但我用这段代码修理了你的小提琴:

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);

答案 1 :(得分:0)

您的current在该范围内没问题,您的coords功能不在合适的范围内。将其与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);

答案 2 :(得分:0)

在打字稿中,我做了以下代码。在下面的代码中,我为 _this 分配了 this

的值
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)
  }
}