Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript全局范围错误解释_Javascript_Variables_Scope - Fatal编程技术网

Javascript全局范围错误解释

Javascript全局范围错误解释,javascript,variables,scope,Javascript,Variables,Scope,我经常遇到这个问题,我想我最终会要求一个解释。我有谷歌浏览器,经常使用javascript控制台。当我声明一个全局变量时,我总是可以在控制台中访问它的内容,但当脚本在浏览器中运行时,我尝试从函数内部访问该变量时,通常会出现“无法读取未定义的属性'top'类型错误” 我将在这里粘贴一段代码,如果有人能向我解释为什么会出现这个错误,我将非常感激 // JavaScript Document var myglobalvariable; // ... $(document).ready( functi

我经常遇到这个问题,我想我最终会要求一个解释。我有谷歌浏览器,经常使用javascript控制台。当我声明一个全局变量时,我总是可以在控制台中访问它的内容,但当脚本在浏览器中运行时,我尝试从函数内部访问该变量时,通常会出现“无法读取未定义的属性'top'类型错误”

我将在这里粘贴一段代码,如果有人能向我解释为什么会出现这个错误,我将非常感激

// 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:)