需要帮助来了解函数的返回值在哪里

时间:2019-01-16 06:11:01

标签: javascript function return-value

我认为我在这里有一个很大的逻辑问题。一个函数的返回值不能被另一个函数识别。我不太确定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)并使用数组中的数据对它们执行更多操作。网页上的onclick按钮会“调用”这两个函数(因此,我必须在addArray按钮之前单击DoStuff按钮)。

6 个答案:

答案 0 :(得分:2)

  

一个函数内的所有值都是该函数的局部值...除非我使用   返回

嗯,这是……部分正确。第一部分是正确的,没有“除非”。 return语句仅指向函数返回的值。这并不意味着此变量现在是全局的。 return中的值是一种“函数的值”,如要稍后使用,则必须将其存储在变量中,如其他人的答案所示。

答案 1 :(得分:0)

在包含这些onclick函数的主js文件中,调用doStuff函数后,需要有一个全局变量来存储numArray。

类似这样的东西:

foreach (DataRowView rowView in dv)
{
    DataRow row = rowView.Row;
    // Do something //
}
  

我的大问题是,当我返回numArray时...该值去哪里了?

返回值将转到您调用该特定函数的位置。

答案 2 :(得分:0)

编辑: 不鼓励在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>

答案 3 :(得分:0)

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

答案 4 :(得分:0)

从DoStuff函数中调用addArray函数,并将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); 
}

答案 5 :(得分:0)

以下是我认为可以帮助您的几件事:

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