document.getElementsByTagName的本地副本

时间:2009-12-07 01:24:00

标签: javascript getelementsbyname

为什么以下代码不起作用?

var f = document.getElementsByTagName;
var x = f('div');

Chrome中出现“TypeError:Illegal invocation”,Safari中出现“TypeError:Type error”。我没有在Firefox中收到错误,但它不起作用。我还没有在IE或Opera中进行测试。

4 个答案:

答案 0 :(得分:7)

在Javascript中没有“绑定方法”这样的东西(借用Python中的术语,我希望你已经知道或解释可能需要更长)。当您获取对“document.getElementsByTagName”的引用时,您只是获取对函数的引用,而不是与文档对象关联的方法。当你调用它时,“this”设置为窗口,而不是文档,所以它不起作用。

技术上这样做可以得到你想要的东西,但你可能会发现它毫无意义:

var x = f.call(document, 'div')

(这是没有意义的,因为它的可读性较低,而且没有调用document.getElementsByTagName()那么快。使用闭包同样毫无意义。)

答案 1 :(得分:2)

因为在javascript中,方法从调用它们的对象获取this,并且调用存储在单独变量中的方法使this成为全局上下文(或{{1在浏览器中)。这应该有效:

window

答案 2 :(得分:0)

试试这个:

function f(divName){
  return document.getElementById(divName);
}

var x = f('div');   

您正在尝试使用括号调用函数。问题是代码中的'f'是一个变量,而不是一个函数。

答案 3 :(得分:0)

原因是需要在对象上调用getElementsByTagName。您可以说在函数定义中,它使用this来确定要查找标记的元素。当您复制函数然后调用它时,它将被赋予一个新范围,这意味着{ {1}}没有指向不同的对象。要调用文档上的函数,请尝试以下操作:

this