Как я могу увеличить значение параметра в объекте, используя функцию? - PullRequest
0 голосов
/ 24 марта 2019

Я хочу иметь возможность увеличивать / изменять значение параметра внутри объекта. Я хочу, чтобы значение изменилось путем доступа к значению переменной, которая увеличивается внутри другой функции.

Пример кода ниже показывает, что я пытаюсь сделать. Я бы хотел, чтобы options.number увеличилось по мере увеличения i внутри masterLoop.

Я знаю, что i не определен в области действия function calc(), но я не могу придумать, как извлечь значение i, поддерживая эту общую структуру кода.

(function masterLoop(i) {
  setTimeout(function() {
    ++i;
    masterLoopStage = i;
    console.log('Stage is: ' + i);
    masterLoop(i);
  }, 5000)
})(1);

function calc() {
  number = i; // I know i isn't defined in this scope, but I can't figure out how access the incrementing value of i inside this function  
  return number;
}

var options = {
  number: calc() // I want this vale to increase along with i inside masterLoop() 
};

setInterval(function() {
  console.log(options.number);
}, 5000);

Как правило, в подобных случаях я пытался бы использовать return для извлечения значения, но я также не смог найти решение с этим, так как увеличивающееся значение находится внутри setInterval и, следовательно, его область действия не доступно для return.

Вот пример этого:

function calc() {
  var foo = 1;
  setInterval(function() {
    var foo = foo + 1;
  }, 1000);
  return foo; // the incrementing value of foo is not available outside the scope of setIterval, so this won't work. The return also won't work inside setInterval.
}

var optionsConstant = {
  maxVolume: 10
};

var options = {
  maxVolume: optionsConstant.maxVolume + calc() // I want calc() to be able to increment along with foo in the setInterval above.
};

setInterval(function() {
  var maxVolume = options.maxVolume;
  console.log('maxVolume:   ' + maxVolume);
}, 5000);

Ответы [ 3 ]

2 голосов
/ 24 марта 2019

Принимая вторую попытку, вы можете сделать calc выражением вызова, вызываемым сразу, - обеспечивающим замыкание, - и вернуть в него функцию, имеющую доступ к foo.

Затем, чтобы сохранить окончательный синтаксис options.maxVolume, вы должны определить это свойство как геттер, чтобы фактически оно выполняло некоторый код при обращении к нему, вызывая calc():

var calc = (function () { // create closure for foo
    var foo = 1;
    setInterval(function() {
        foo = foo + 1; // remove var!
    }, 100);
    return function calc() { // return a function
        return foo;
    }
})();

var optionsConstant = {
    maxVolume: 10
};

var options = {
    get maxVolume() { // make it a getter
        return optionsConstant.maxVolume + calc();
    }
};

setInterval(function() {
    var maxVolume = options.maxVolume;
    console.log('maxVolume:   ' + maxVolume);
}, 500);
1 голос
/ 24 марта 2019

Можете ли вы объявить инкрементную переменную за пределами области действия функции masterloop, чтобы другие функции могли обращаться к ней и при необходимости читать ее 'значение?

Вам нужно будет обязательно повторно инициализировать ее значение при необходимости.

0 голосов
/ 24 марта 2019

Я думаю, вам нужно использовать закрытие. Вот один пример:

let returnI = (function masterLoop(i) {
    setTimeout(function() {
        ++i;
        masterLoopStage = i;
        console.log('Stage is: ' + i);
        return masterLoop(i);
    }, 5000)
})(1);

function calc() {
    number = returnI; 
    return number;
}

var options = {
    number: calc()
};

setInterval(function() {
    console.log(options.number);
}, 5000);
...