为什么下面的代码不起作用?
var f = document.getElementsByTagName;
var x = f('div');
我在 Chrome 中收到“TypeError:非法调用”,在 Safari 中收到“TypeError:类型错误”。我在 Firefox 中没有收到错误,但它不起作用。我还没有费心在 IE 或 Opera 中进行测试。
为什么下面的代码不起作用?
var f = document.getElementsByTagName;
var x = f('div');
我在 Chrome 中收到“TypeError:非法调用”,在 Safari 中收到“TypeError:类型错误”。我在 Firefox 中没有收到错误,但它不起作用。我还没有费心在 IE 或 Opera 中进行测试。
在 Javascript 中没有“绑定方法”之类的东西(借用 Python 的术语,我希望你已经知道,或者解释可能需要更长的时间)。当您获取对“document.getElementsByTagName”的引用时,您只是获得对函数的引用,而不是与文档对象关联的方法。当你调用它时,“this”被设置为窗口,而不是文档,所以它不起作用。
从技术上讲,这样做会让你得到你想要的,但你可能会看到它毫无意义:
var x = f.call(document, 'div')
(这是没有意义的,因为它的可读性较差,并且不如调用 document.getElementsByTagName() 快。使用闭包同样没有意义。)
因为在 javascript 中,方法this
从调用它们的对象中获取它们,并调用存储在单独变量中的方法使其this
成为全局上下文(或window
在浏览器中)。这应该工作:
var f function ()
{
return document.getElementsByTagName.apply(
document
, arguments
);
}
var x = f('div');
试试这个:
function f(divName){
return document.getElementById(divName);
}
var x = f('div');
您正在尝试通过使用括号来调用函数。问题是你的代码中的'f'是一个变量,而不是一个函数。
原因是需要在对象上调用 getElementsByTagName。你可以说在函数定义内部,它用来this
确定要在哪个元素中查找标签。当你复制函数然后调用它时,它将被赋予一个新的范围,这意味着this
没有指向不同的对象. 要在文档上调用该函数,请尝试以下操作:
var f = document.getElementsByTagName;
var x = f.call(document, "pre");
alert(x[0]);