Javascript [function].apply()导致;应为JScript对象";IE中的错误

Javascript [function].apply()导致;应为JScript对象";IE中的错误,javascript,internet-explorer,object-expected,Javascript,Internet Explorer,Object Expected,以下代码行导致IE中出现“预期JScript对象”错误: hideElements.apply(window, elements); 根据IE的说法,“预期的JScript对象”指的是hideElements,这是一个将任意数量的HTML对象作为参数并隐藏它们的函数 具体地说,我通过调用getElementsByTagName来检索HTML对象数组,我想将此数组作为参数列表传递给函数hideElements。在这种情况下,JS函数apply()正是我所需要的。我知道我当然可以用不同的方式编写代

以下代码行导致IE中出现“预期JScript对象”错误:

hideElements.apply(window, elements);
根据IE的说法,“预期的JScript对象”指的是
hideElements
,这是一个将任意数量的HTML对象作为参数并隐藏它们的函数

具体地说,我通过调用
getElementsByTagName
来检索HTML对象数组,我想将此数组作为参数列表传递给函数
hideElements
。在这种情况下,JS函数
apply()
正是我所需要的。我知道我当然可以用不同的方式编写代码,但由于这在Firefox和Chrome上非常有效,而且在技术上是正确的,我真的很想知道为什么IE会被困在那里

我已经确定,当执行该行时:

  • 窗口
    不为空且类型为
    窗口
  • 元素
    不为空且类型为
    HTMLCollection
    ;及
  • hideElements
    是一个功能完整的JS函数(它自己可以完美地工作,并且在执行上述代码时可以完全加载)

getElementsByTagName
返回一个
节点列表
apply
要求第二个参数是
数组
。如果您将
元素
转换为实际数组(使用循环),它应该可以工作


注意:在IEI中,我不认为IE喜欢像对待普通JS对象一样对待
window
,但我可能错了。我不确定HTMLCollection是否与数组兼容(它是实时的),您是否尝试过先将副本复制到实际的
[]
数组中?谢谢Eric,这就是问题的根源。不幸的是,在我的例子中,将集合转换为数组并不是最糟糕的事情。我想我唯一的选择是使用另一种方法。让你想知道为什么它可以与FF和Chrome配合使用,尽管。。。请毫不犹豫地发布答案,我会接受的。您也可以使用
call
而不是
apply
,然后让
hideElements
函数处理
元素
集合。“使用给定的此值和单独提供的参数调用函数。”我只是将代码更改为
hideElements(elements)
,并修改函数
hideElements
,以便如果第一个参数是数组,它将循环通过它;否则,它将遍历参数。+1。
(i+=1)
Crockford风格的具体原因是什么?@MrBlaster:是的,这是Crockford风格。这样对我的影响就更清楚了有趣的是。。。我假设
参数
是传递给
应用
的可接受值。。。但那也不是一个数组。。。你知道为什么没问题,但是
NodeList
不是吗?@Dancrumb在IE<9
NodeList
中不被认为是javascript对象。看见
function nodeList2Array(nodes){
  var arr = [];
  for (var i=1; i<nodes.length;(i+=1)){
    arr.push(nodes[i]);
  }
  return arr;
}