Javascript全局范围错误解释
我经常遇到这个问题,我想我最终会要求一个解释。我有谷歌浏览器,经常使用javascript控制台。当我声明一个全局变量时,我总是可以在控制台中访问它的内容,但当脚本在浏览器中运行时,我尝试从函数内部访问该变量时,通常会出现“无法读取未定义的属性'top'类型错误” 我将在这里粘贴一段代码,如果有人能向我解释为什么会出现这个错误,我将非常感激Javascript全局范围错误解释,javascript,variables,scope,Javascript,Variables,Scope,我经常遇到这个问题,我想我最终会要求一个解释。我有谷歌浏览器,经常使用javascript控制台。当我声明一个全局变量时,我总是可以在控制台中访问它的内容,但当脚本在浏览器中运行时,我尝试从函数内部访问该变量时,通常会出现“无法读取未定义的属性'top'类型错误” 我将在这里粘贴一段代码,如果有人能向我解释为什么会出现这个错误,我将非常感激 // JavaScript Document var myglobalvariable; // ... $(document).ready( functi
// JavaScript Document
var myglobalvariable;
// ...
$(document).ready( function() {
myglobalvariable = document.getElementsByTagName("article");
// ...
});
function myFunction() {
for (i in myglobalvariable) {
mylocalvariable_top = myglobalvariable[i].style.top; // Error points to this line
// ...
}
}
myFunction通常会被事件处理程序调用并报告上述错误。我怀疑您所做的不是您想要的
for (i in myglobalvariable) { }
这不会循环数组中的项,而是循环对象的键/属性名
myglobalvariable[i]
在上面,您可以使用该键访问任何类型的属性
myglobalvariable[i].style.top
在上面,您可以访问所述对象的样式属性。如果该对象没有样式属性,则该属性将是未定义的。这意味着当您在不存在的属性上调用.top时,您会得到“无法读取未定义的属性'top'”
你在这里提出的是一个具体的问题,而不是一个普遍的“全球范围的误解”
解决方案
var i, len = myglobalvariable.length;
for (i = 0; i < len; i++) {
if (myglobalvariable[i].style)
mylocalvariable_top = myglobalvariable[i].style.top;
// ...
}
var i,len=myglobalvariable.length;
对于(i=0;i
我怀疑你所做的不是你想要的
for (i in myglobalvariable) { }
这不会循环数组中的项,而是循环对象的键/属性名
myglobalvariable[i]
在上面,您可以使用该键访问任何类型的属性
myglobalvariable[i].style.top
在上面,您可以访问所述对象的样式属性。如果该对象没有样式属性,则该属性将是未定义的。这意味着当您在不存在的属性上调用.top时,您会得到“无法读取未定义的属性'top'”
你在这里提出的是一个具体的问题,而不是一个普遍的“全球范围的误解”
解决方案
var i, len = myglobalvariable.length;
for (i = 0; i < len; i++) {
if (myglobalvariable[i].style)
mylocalvariable_top = myglobalvariable[i].style.top;
// ...
}
var i,len=myglobalvariable.length;
对于(i=0;i
这将创建节点的节点列表
$(document).ready( function() {
myglobalvariable = document.getElementsByTagName("article");
// ...
});
这将遍历每个节点和节点列表
对象上的任何附加属性
function myFunction() {
for (i in myglobalvariable) {
mylocalvariable_top = myglobalvariable[i].style.top; // Error points to this line
// ...
}
}
也就是说,您可以在myglobalvariable
中遇到不是节点且没有样式
属性的项。特别是,i
将在迭代过程中的某个点成为项
和长度
这将更安全地迭代列表:
function myFunction() {
for (var i = 0; i < myglobalvariable.length; i++) {
mylocalvariable_top = myglobalvariable[i].style.top; // Error points to this line
// ...
}
}
函数myFunction(){
for(var i=0;i
这将创建节点的节点列表
$(document).ready( function() {
myglobalvariable = document.getElementsByTagName("article");
// ...
});
这将遍历每个节点和节点列表
对象上的任何附加属性
function myFunction() {
for (i in myglobalvariable) {
mylocalvariable_top = myglobalvariable[i].style.top; // Error points to this line
// ...
}
}
也就是说,您可以在myglobalvariable
中遇到不是节点且没有样式
属性的项。特别是,i
将在迭代过程中的某个点成为项
和长度
这将更安全地迭代列表:
function myFunction() {
for (var i = 0; i < myglobalvariable.length; i++) {
mylocalvariable_top = myglobalvariable[i].style.top; // Error points to this line
// ...
}
}
函数myFunction(){
for(var i=0;i
正如其他人所说,最好避免。。。用于阵列的
。也就是说,为了澄清产生此错误的误解,您应该写:
function myFunction() {
for (i in myglobalvariable) {
mylocalvariable_top = i.style.top; // <-- i IS the element
// <-- for clarity you should probably rename "i" to
// "element" or something more descriptive which will
// make clear it is not a numerical index
// ...
}
}
函数myFunction(){
for(我的全局变量中的i){
mylocalvariable_top=i.style.top;//正如其他人所说,最好避免数组中的“for…”。也就是说,为了澄清产生此错误的误解,您应该写:
function myFunction() {
for (i in myglobalvariable) {
mylocalvariable_top = i.style.top; // <-- i IS the element
// <-- for clarity you should probably rename "i" to
// "element" or something more descriptive which will
// make clear it is not a numerical index
// ...
}
}
函数myFunction(){
for(我的全局变量中的i){
mylocalvariable_top=i.style.top;//for in应该只与对象一起使用,而不是arraysoff主题:你有所有的jQuery帮助程序,但你不愿意使用它们?@DanLee我的脚本中有jQuery帮助程序,但我正在运行一个相当高性能的进程。我在谷歌上搜索了jQuery帮助程序的性能,一些开发人员评论道在jQuery中,选择器的处理时间更长。因此我开始尝试让脚本运行得更快。部分这样做是为了了解有关性能的更多信息。@user2307877那么为什么要首先使用~90kb的库呢?只为DOM准备?有更简单的方法可以做到这一点。因为in应该只用于对象,而不是arraysoff主题:您所有的jQuery助手都可用,但你不愿意使用它们吗?@DanLee我的脚本中有jQuery助手,但我正在运行一个相当高性能的过程。我在谷歌上搜索了jQuery助手的性能,一些开发人员评论说jQuery选择器需要更长的时间来处理。所以我开始尝试让我的脚本运行得更快。部分通过这样做可以了解更多关于性能的信息。@user2307877那么为什么要首先使用~90kb的库呢?只是为了DOM就绪?有更简单的方法可以做到这一点。getElementsByTagName
返回一个NodeList
,它在许多方面类似于数组,但不是一个。上面提到的for循环将问题。谢谢svidgen:)getElementsByTagName
返回一个NodeList
,它在许多方面像数组,但不是一个。上面提到的for循环解决了问题。谢谢svidgen:)