Могу ли я использовать итератор цикла for в параметре функции стрелки, которая будет передана в цикл? - PullRequest
0 голосов
/ 03 мая 2018

Я программирую физику, и текущая версия находится на моем сайте. Я не знаю, смогу ли я опубликовать ссылку, поэтому я не буду. Программа представляет собой многозвенный перевернутый маятник, и я пытаюсь написать функции для запуска физики. Чтобы сделать это, я должен установить множество массивов для разных значений каждого перевернутого маятника, таких как массив для всех моментов промежутков, масс, тэт и многого другого. Вот как я это делаю прямо сейчас:

    function fillArray(begin, end, alg) {
        let arr = [];

        for (let i = begin; i < end; i++) {
            arr[i] = alg();
        }
        return arr;
    }

    let Ls = fillArray(0, numPoles, () => 2 * this.ls[i]);

Когда я вывожу массив Ls, он говорит, что каждый элемент внутри - это Nan (не число). Что я делаю неправильно? Как я могу сделать эту работу?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018
  1. функция alg() передается вне цикла, где содержится переменная i.
    this.ls[i] равно undefined, где i равно undefined
    поэтому 2 * undefined возврат NaN

  2. this.ls не входит в область действия функции, поэтому функция стрелки должна использовать глобальную ls, или вам нужно передать ее в функцию.

  3. Попробуйте следующий код

function fillArray(begin, end, alg) {
	let arr = [];
	for (let i = begin; i < end; i++) {
		arr[i] = alg(i);
	}
	return arr;
}
let ls = [1,3,11,22];
let numPoles = 3;
let Ls = fillArray(0, numPoles, (i) => 2 * ls[i]);
console.log(Ls);
0 голосов
/ 03 мая 2018

Возможно, было бы намного проще использовать Array.from inline, чем вызывать другую автономную функцию:

const obj = {
  ls: [5, 6, 7, 8, 9],
  makeLs: function() {
    const numPoles = 5;
    const Ls = Array.from({ length: numPoles }, (_, i) => 2 * this.ls[i]);
    console.log(Ls);
  },
};

obj.makeLs();

Ближе к исходному коду вы можете изменить его, приняв alg принять параметр, например i:

const obj = {
  ls: [5, 6, 7, 8, 9],
  makeLs: function() {
    function fillArray(begin, end, alg) {
      let arr = [];
      for (let i = begin; i < end; i++) {
        arr[i] = alg(i);
      }
      return arr;
    }
    const numPoles = 5;
    let Ls = fillArray(0, numPoles, (i) => 2 * this.ls[i]);
    console.log(Ls);
  },
};

obj.makeLs();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...