Нужна помощь в понимании того, куда возвращается возвращаемое значение функции - PullRequest
0 голосов
/ 16 января 2019

Я думаю, у меня здесь довольно большая логическая проблема. Возвращаемое значение функции не распознается другой функцией. Я не совсем уверен, куда возвращается значение, возвращаемое DoStuff ... почему я не могу получить доступ к значению numArray?

Насколько я понимаю, все значения внутри функции являются локальными для этой функции ... если только я не использую return, что ДОЛЖНО позволить мне получить доступ к этому значению.

Таким образом, этот код находится просто во внешнем js-файле ... единственное, что вы видите, это то, что вы видите Мой большой вопрос, когда я возвращаю numArray ... куда это значение уходит?

function doStuff(){

    //document.write("We are testing document writing now!");

    let numArray;
    let sumArray;
    let start = parseInt(prompt("Enter a small number"));
    let end = parseInt(prompt("Enter a larger number"));

    if (start > end){
        alert("Error: first int greater than last!")
    } else {
        let arraySize = end - start;
        numArray = [start];
        for (let x = start + 1; x <= end; ++x){
            numArray.push(x);
        } 
        console.log(numArray);    
        return numArray;  
    }
}

function addArray(numArray) {
    console.log(numArray);
}
<form> <input type="button" value="Click Me to generate an array of numbers!" onclick="doStuff()"/> <input type="button" value="Click me to add the array numbers" onclick="addArray()"/> </form>

Консоль сообщает мне, что numArray не определен, когда я пытаюсь войти в него. Мне нужно получить массив (numArray) и использовать данные в массиве, чтобы сделать что-то еще с ними. Обе функции «вызываются» с помощью кнопок на веб-странице (поэтому мне нужно нажать кнопку DoStuff перед кнопкой addArray).

Ответы [ 6 ]

0 голосов
/ 16 января 2019

Вот пара вещей, которые, я думаю, могут вам помочь:

1) Разделите ваш код. doStuff запрашивает ввод данных у пользователя, но также генерирует массив, содержащий значения из min-max. У вас должна быть отдельная функция, которая генерирует массив от мин до макс. Разделив его, вы сможете легче идентифицировать проблему.

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

3) Сделайте ваши интерфейсы согласованными. Вы не должны возвращать значение одного экземпляра и ничего в другом. Если есть ошибка, убедитесь, что вы согласны с тем, как вы уведомляете звонящего.

function buildArray(start, end) {
  let arr = [];

  if (start > end) {
    // There are a lot ways to deal with this
    // But you want a consistent interface for letting
    // the caller no that start < end
    throw {
     message: 'Start can\'t be bigger than end',
    };
  }
  
  for (let x = start; x <= end; x++) {
    arr.push(x);
  }
  
  return arr; 
}

// encapsulate the variable numArray, so that it is only accessible
// to the methods that need it
var numArrayModule = (function(){
   let numArray = [];
   
   return {
     doStuff: function(){
        let start = parseInt(prompt("Enter a small number"));
        let end = parseInt(prompt("Enter a larger number"));
        try {
          numArray = buildArray(start, end);
        } catch(err) {
          console.log(err);
        }
     },
     addArray: function(){
        console.log(numArray);
     },
   }

}());
// You may use these as onClick handlers as well.
numArrayModule.doStuff();
numArrayModule.addArray();
0 голосов
/ 16 января 2019

вызов функции addArray из функции DoStuff и передача ей numArray в качестве параметра

function DoStuff() {

let numArray;
let sumArray;
let start = 1;
let end = 5;

if (start > end){
    alert("Error: first int greater than last!")
}
else {
    let arraySize = end - start;
    numArray = [start];
    for (let x = start + 1; x <= end; ++x){
        numArray.push(x);
    }    
}
addArray(numArray)
}

function addArray(numArray){
        console.log(numArray); 
}
0 голосов
/ 16 января 2019

doStuff () возвращает значение, поэтому используйте возврат этой функции в качестве переменной. Мы можем присвоить это возвращаемое значение другой переменной или использовать непосредственно в выражении. Поэтому вызовите dostuff (), чтобы получить возвращаемое значение.

function doStuff(){

    //document.write("We are testing document writing now!");

    let numArray;
    let sumArray;
    let start = parseInt(prompt("Enter a small number"));
    let end = parseInt(prompt("Enter a larger number"));

    if (start > end){
        alert("Error: first int greater than last!")
    } else {
        let arraySize = end - start;
        numArray = [start];
        for (let x = start + 1; x <= end; ++x){
            numArray.push(x);
        } 
        console.log(numArray);    
        return numArray;  
    }
}

 console.log('HERE IS ARRAY: '+doStuff());
0 голосов
/ 16 января 2019

все значения внутри функции являются локальными для этой функции ... если я не использую вернуться

Ну, это ... отчасти правда. Первая часть верна, и нет «если». return оператор просто указывает на значение, которое, в общем-то, возвращается функцией. Это не значит, что эта переменная теперь глобальная. Значение в return является своего рода «значением функции», и вы должны сохранить его в переменной, если хотите использовать его позже, как вы можете видеть в ответах других.

0 голосов
/ 16 января 2019

Изменить: Причина, по которой глобальные переменные не поощряются в js, заключается в том, что весь код имеет единственное глобальное пространство имен, где javascript автоматически подразумевает глобальные переменные (например, переменные, которые явно не объявлены в локальной области, автоматически добавляются в глобальное пространство имен). Полагание слишком много на глобальные переменные может привести к некоторым конфликтам между скриптами на одной странице. Это не значит, что вы не должны использовать глобальные переменные, но вы не должны использовать их легкомысленно. Если вам нужно, чтобы переменная была доступна после завершения функции, ваш выбор ограничен, поэтому либо используйте глобальную переменную, либо передайте переменную той функции, в которой она вам нужна.

Вам просто нужно сохранить результат doStuff и затем получить доступ к этой переменной в addArray:

var result
function doStuff() {

  //document.write("We are testing document writing now!");

  let numArray;
  let sumArray;
  let start = parseInt(prompt("Enter a small number"));
  let end = parseInt(prompt("Enter a larger number"));

  if (start > end) {
    alert("Error: first int greater than last!")
  } else {
    let arraySize = end - start;
    numArray = [start];
    for (let x = start + 1; x <= end; ++x) {
      numArray.push(x);
    }
    result = numArray; // save result for later (has to be a global scope)
  }
}

function addArray() { // you defined this without an input in your form, so stick to that
  if (result) // check if value exists
    console.log(result);
  else
    console.log("Please enter the numbers boundaries first first.");
}
<form>
  <input type="button" value="Click Me to generate an array of numbers!" onclick="doStuff()" />
  <input type="button" value="Click me to add the array numbers" onclick="addArray()" />
</form>
0 голосов
/ 16 января 2019

В вашем основном js-файле, который содержит эти функции onclick, вам нужно иметь глобальную переменную для хранения вашего numArray после вызова функции doStuff.

Примерно так:

let globalNumArray

// on click button doStuff
function (){
    globalNumArray = doStuff()
}

// on click button addArray
function() {
    addArray(globalNumArray)
}

Мой большой вопрос, когда я возвращаю numArray ... куда девается это значение?

Возвращаемое значение отправляется туда, где вы вызвали эту конкретную функцию.

...