2015-05-06 61 views
1

有人能帮内部产生我明白为什么我不能使用该功能推向一个数组的generatedNumbers全局变量:推阵列的功能,全局变量

var totalFrames = document.getElementById("totalFrames").value; 
var framesToSkip = document.getElementById("framesToSkip").value; 
var generatedNumbers = []; 

function clickGenerate() { 
    for (var i = 1; i <= totalFrames; i++) { 
    if ((i % framesToSkip) === 0) { 
     // do nothing 
    } else { 
     generatedNumbers.push(i); 
    } 
    } 
    document.getElementById("numberList").innerHTML = generatedNumbers; 
} 

你可以看到它伴随HTML在这里:

https://jsfiddle.net/bdorrance/wszzvpu1/

如果我把里面的函数变量,它工作正常,但我需要的变量是全球性的,使他们能够被其它函数访问。你可以看到,代码在这里:

https://jsfiddle.net/bdorrance/t246rnxe/

回答

1

你的问题不是全球阵列。 你的问题是你没有收集“totalFrames”和“totalFramesSip”的实际值。 随着函数被调用。变量totalFramesframesToSkip的值是0

您必须收集函数调用的实际值。 这些行添加在你的函数:

framesToSkip = document.getElementById("framesToSkip").value; 
totalFrames = document.getElementById("totalFrames").value; 

那么它应该工作

+0

嘿@Livingstone非常感谢你为你的洞察力。这确实解决了我的问题。然而,我不是100%确定为什么这些变量必须放在函数内部,并且函数不能读取变量,如果它们是全局的。我对JavaScript和一般编程相当陌生。你能否向我解释到底发生了什么?非常感谢你的帮助! – bdorrance

+0

@bdorrance - 我的答案解释了原因。在对这些输入进行任何处理之前,您正在定义这些变量。只有在按钮被点击后,您才需要获取这些值。所以你可以在函数之外的全局意义上定义它们,而不是一个值,然后在点击按钮后在你的函数中更新它们。 –

+0

@bdorrance - 在您的代码中,您只需在网站加载后收集textfied的值。这意味着你会得到默认值。这些存储在你的两个变量中。所以,当函数'clickGenerate'被调用时,它将与这些“未修改”的值一起工作。你必须确保你得到了实际的价值。为此,每次调用函数时都必须收集该值。希望有所帮助。对不起我的英语不好;) – Livingstone

2

你定义之前你totalFramesframesToSkip变量你输入任何东西到这些输入框或点击按钮生成。盒子里没有东西,所以没有什么可以抓取的,也没有东西可以推到阵列上。

在您的包含变量的jsfiddle中,直到点击按钮时才定义变量,此时您已经在框中输入了数字。

您可以通过在函数外初始定义变量来使变量全局化,例如var totalFrames, framesToSkip;,然后为其分配onClick函数中输入框的值。

修JS:

var totalFrames, framesToSkip; 

function clickGenerate() { 
    totalFrames = document.getElementById("totalFrames").value; 
    framesToSkip = document.getElementById("framesToSkip").value; 
    var generatedNumbers = []; 

    for (var i = 1; i <= totalFrames; i++) { 
     if ((i % framesToSkip) === 0) { 
      // do nothing 
     } else { 
      generatedNumbers.push(i); 
     } 
    } 
    document.getElementById("numberList").innerHTML = generatedNumbers; 
} 

function showFullResult() { 
    document.getElementById("numberList").innerHTML = "full test"; 
} 

function showShortResult() { 
    document.getElementById("numberList").innerHTML = "short test"; 
} 

Here is an updated example in jsfiddle

-1

正如其他人所说:移动的totalFrames和framesToSkip变量的函数内部:

var totalFrames; 
var framesToSkip; 
function clickGenerate() { 
    totalFrames = document.getElementById("totalFrames").value; 
    framesToSkip = document.getElementById("framesToSkip").value; 
    console.log(totalFrames) 
    for (var i = 1; i <= totalFrames; i++) { 
     if ((i % framesToSkip) === 0) { 
      // do nothing 
     } else { 
      generatedNumbers.push(i); 
     } 
    } 
    document.getElementById("numberList").innerHTML = generatedNumbers; 
} 
+0

OP希望'totalFrames'和'framesToSkip'变量是全局的,而不是在该函数中定义的。 OP已经在他们的帖子中提供了这个例子。 –

+0

公平点。谢谢@TimMcClure – gin93r

+0

谢谢TimMcClure和@Veo。 – bdorrance