Javascript document.getElementsByTagName的本地副本
为什么下面的代码不起作用Javascript document.getElementsByTagName的本地副本,javascript,getelementsbyname,Javascript,Getelementsbyname,为什么下面的代码不起作用 var f = document.getElementsByTagName; var x = f('div'); 我在Chrome中看到“TypeError:非法调用”,在Safari中看到“TypeError:类型错误”。我在Firefox中没有发现错误,但它不起作用。我还没有在IE或Opera中进行测试 试试这个: function f(divName){ return document.getElementById(divName); } var x =
var f = document.getElementsByTagName;
var x = f('div');
我在Chrome中看到“TypeError:非法调用”,在Safari中看到“TypeError:类型错误”。我在Firefox中没有发现错误,但它不起作用。我还没有在IE或Opera中进行测试 试试这个:
function f(divName){
return document.getElementById(divName);
}
var x = f('div');
您正试图使用括号调用函数。问题是代码中的“f”是一个变量,而不是一个函数 试试这个:
function f(divName){
return document.getElementById(divName);
}
var x = f('div');
您正试图使用括号调用函数。问题是代码中的“f”是一个变量,而不是一个函数 在Javascript中没有“绑定方法”(借用Python中的术语,我希望您已经知道,或者解释可能需要更长的时间)。当您获取对“document.getElementsByTagName”的引用时,您仅获取对函数的引用,而不是与document对象关联的方法。当您调用它时,“this”设置为窗口,而不是文档,因此它不起作用 从技术上讲,这样做会得到你想要的,但正如你可能看到的那样,这是毫无意义的:
var x = f.call(document, 'div')
(这是毫无意义的,因为它的可读性较差,速度不如调用document.getElementsByTagName()。使用闭包也同样毫无意义。)在Javascript中没有“绑定方法”(借用Python中的术语,我希望您已经知道,或者解释可能需要更长时间)。当您获取对“document.getElementsByTagName”的引用时,您仅获取对函数的引用,而不是与document对象关联的方法。当您调用它时,“this”设置为窗口,而不是文档,因此它不起作用 从技术上讲,这样做会得到你想要的,但正如你可能看到的那样,这是毫无意义的:
var x = f.call(document, 'div')
(这是毫无意义的,因为它的可读性较差,速度不如调用document.getElementsByTagName()。使用闭包也同样毫无意义。)因为在javascript中,方法从调用它们的对象获取它们的
此
,调用存储在单独变量中的方法会使this
成为全局上下文(或浏览器中的window
)。这应该起作用:
var f function ()
{
return document.getElementsByTagName.apply(
document
, arguments
);
}
var x = f('div');
因为在javascript中,方法从调用它们的对象获取它们的
this
,调用存储在单独变量中的方法使this
成为全局上下文(或浏览器中的窗口
)。这应该起作用:
var f function ()
{
return document.getElementsByTagName.apply(
document
, arguments
);
}
var x = f('div');
原因是需要对对象调用getElementsByTagName。您可以说,在函数定义中,它使用
this
来确定在哪个元素中查找标记。当您复制函数并调用它时,它将被赋予一个新的作用域,这意味着this
没有指向其他对象。要在文档上调用函数,请尝试以下操作:
var f = document.getElementsByTagName;
var x = f.call(document, "pre");
alert(x[0]);
原因是需要对对象调用getElementsByTagName。您可以说,在函数定义中,它使用
this
来确定在哪个元素中查找标记。当您复制函数并调用它时,它将被赋予一个新的作用域,这意味着this
没有指向其他对象。要在文档上调用函数,请尝试以下操作:
var f = document.getElementsByTagName;
var x = f.call(document, "pre");
alert(x[0]);
接下来的问题应该是,为什么
document.getElementsByTagName.call(document,'div')
不能在IE中工作?哪个IE?它在IE8中工作得很好。@Peter Hansen:IE8可能重复的后续问题应该是:document.getElementsByTagName.call(document,'div')
在IE中工作吗?哪个IE?它在IE8中工作得很好。@Peter Hansen:IE8的可能副本您可以在不应用的情况下执行此操作,原因有二:1getElementsByTagName
只接收一个参数2。由于您在文档
对象上调用函数,上下文将被隐式设置,因此没有理由使用apply再次设置该函数。您可以在不使用apply
的情况下执行此操作,原因有二:1getElementsByTagName
只接收一个参数2。由于您是在文档
对象上调用函数,因此上下文将被隐式设置,因此没有理由使用apply.再次设置它。谢谢,这很有道理。谢谢