1

为什么下面的代码不起作用?

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

我在 Chrome 中收到“TypeError:非法调用”,在 Safari 中收到“TypeError:类型错误”。我在 Firefox 中没有收到错误,但它不起作用。我还没有费心在 IE 或 Opera 中进行测试。

4

4 回答 4

7

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

从技术上讲,这样做会让你得到你想要的,但你可能会看到它毫无意义:

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

(这是没有意义的,因为它的可读性较差,并且不如调用 document.getElementsByTagName() 快。使用闭包同样没有意义。)

于 2009-12-07T01:29:05.370 回答
2

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

var f function ()
{
    return document.getElementsByTagName.apply(
        document
      , arguments
    );
}
var x = f('div');
于 2009-12-07T01:29:26.543 回答
0

试试这个:

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

var x = f('div');   

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

于 2009-12-07T01:28:10.113 回答
0

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

var f = document.getElementsByTagName;
var x = f.call(document, "pre");
alert(x[0]);
于 2009-12-07T01:31:00.967 回答