我认为我在这里有一个很大的逻辑问题。一个函数的返回值不能被另一个函数识别。我不太确定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按钮)。
答案 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();