2013-11-25 2 views
0

У меня есть функция для генерации некоторых случайных чисел и внутри этой функции я делаю вызов setInterval(), потому что мне нужно, чтобы эти числа обновлялись каждые 2 секунды.Доступ к глобальным переменным в setInterval()

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

Это все хорошо, обновление значения, как ожидалось, но моя цель состоит в том, чтобы иметь две глобальные переменные (назовем их знач1/val2) обновление в рамках этой функции setInterval(). По-видимому, у меня есть проблема, потому что эти переменные недоступны внутри функции, и я не могу получить доступ к «текущей» переменной извне этой функции. Я знаю, что здесь что-то не хватает, что это?

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

+2

объявить 'вар ток = {};' вне функции –

+0

здесь является jsfiddle http://jsfiddle.net/4uNen/2/ –

ответ

2

Вам просто нужно определить var current = {}; в глобальном масштабе, и быть уверенным, не определить var current в любой другой области. current=[whatever]; в порядке, до тех пор, пока нет var.

Edit: Я не уверен, что вы сделали, но я установил свою скрипку с этим кодом:

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

Я пошел вперед и сделал это, но теперь current always = {}, поэтому current.x всегда не определено. Я продолжу возиться, спасибо за быстрый ответ! –

+0

@ Николас Крейдберг: Хм. Это отлично работает для меня. Проверьте код, который я редактировал выше. – user1618143

+0

Спасибо за подробный пост. По какой-то причине он не срабатывает с первой попытки, но работает потом, но это другая проблема. Маркировка как решение! –

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

«Ваш« текущий »в порядке» - нет, это не так. Это неявный глобальный. Это плохая практика. Поместите этот код в строгом режиме и посмотрите, как он сломается. –

+0

Почему? Он используется только в функции setInterval. – putvande

+1

Захламление глобального пространства всегда плохое, но неявные глобальные значения - это вещь сама по себе, потому что даже просмотр кода не будет исправлять ее. Никакая переменная не должна быть объявлена ​​без 'var'. Вы рискуете нарушить другой код, а также сделать свой код сложным для поддержания и отладки. Это небольшой скрипт, но он всегда начинается с небольших скриптов. –

Смежные вопросы