为什么以下代码不起作用?
var f = document.getElementsByTagName;
var x = f('div');
Chrome中出现“TypeError:Illegal invocation”,Safari中出现“TypeError:Type error”。我没有在Firefox中收到错误,但它不起作用。我还没有在IE或Opera中进行测试。
答案 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