推送到阵列的数据不会保留在阵列中

时间:2017-10-18 17:14:51

标签: javascript jquery arrays

有一个JS / jQuery的奇怪问题。当我将数据从while循环推送到数组时,数据变为循环的本地。

如果我移动console.log(bxStore),忽略我的代码几乎不起作用的事实;在我的文件准备好{}或在while循环下面的任何地方,它读取未定义。

var bxRegEx =  new RegExp(/[b][x]\d*[y]\d*[w]\d*[h]\d*/) //identifier 

expression

function bxCycle(){ //cycle html for indbx identifiers
    var cycle = 0
    var bxIdGet = document.getElementsByTagName('div')[cycle].outerHTML

    var bxStore = new Array()
    while (bxRegEx.test(bxIdGet)){
        bxStore.push(bxRegEx.exec(bxIdGet))
        cycle++
        bxIdGet = document.getElementsByTagName('div')[cycle].outerHTML
    console.log(bxStore)
    }
}

$(document).ready(function(){
    bxCycle()

})

https://codepen.io/anon/pen/wrRVKw?editors=1112

编辑:似乎不是一个变量范围问题的人,我的例子确实在函数中显示它,但在外面声明它时我得到了同样的问题。

4 个答案:

答案 0 :(得分:2)

我还没有足够的声誉发表评论,所以我必须写一个完整的答案,即使它可能无法完全解决你的问题!

因为你在函数中定义了bxStore,它只能在该函数中使用(它的“范围”在函数内部)。因此,如果将console.log(bxStore)移动到document.ready函数中,则无法看到bxStore。

解决当前问题的一种方法是将bxStore定义为全局变量(使用bgRegEx),如stravanato所说,以便document.ready函数可以看到它。更好的方法是拥有你的bxcycle函数

return bxStore

...然后您可以在文档就绪控制台上记录您的结果,如

$(document).ready(function(){
    console.log(bxCycle())
})

答案 1 :(得分:2)

我看过你的codepen。正确的代码如下:

function bxCycle(){ //cycle html for indbx identifiers
    var bxRegEx =  /bx\d*y\d*w\d*h\d*/i //identifier expression
    var bxStore = new Array();
    for (i in document.getElementsByTagName('div')) {
        if (bxRegEx.test(i)){
            bxStore.push(bxRegEx.exec(i))
        }
    }
    return bxStore
}

$(document).ready(function(){
    console.log(bxCycle())
})

答案 2 :(得分:0)

bxStore范围在函数内部,因此在其外部不可见。 如果console.log在函数内部,它应该回显一些东西,如果它在外面它不应该。

您应该将var bxStore = new Array();放在功能之外。

答案 3 :(得分:0)

您必须创建一个闭包来公开函数的局部变量,因为您在函数内部声明了bxStore,它将在函数执行后被转储。是的只是做一个简单的回报

return bxStore

或者您可以创建一个全局变量。