有一个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
编辑:似乎不是一个变量范围问题的人,我的例子确实在函数中显示它,但在外面声明它时我得到了同样的问题。
答案 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
或者您可以创建一个全局变量。