奇怪的IE错误-JavaScript全局变量和具有name属性的元素之间
我在IE6、IE7和IE8中测试了以下代码,结果相同:奇怪的IE错误-JavaScript全局变量和具有name属性的元素之间,javascript,internet-explorer,Javascript,Internet Explorer,我在IE6、IE7和IE8中测试了以下代码,结果相同: IE非常乐意为每个具有“id”值的页面元素创建窗口的属性。这只是一件事。(注意:这句话不是真的。) 编辑-是,元素没有“id”。好吧,好消息-IE也将引用人的名字视为“id”。回想一下,该页面上的document.getElementById(“cd”)将返回对的引用,就像它有一个“id”元素一样 再次编辑我认为说IE实际上创建了窗口属性是不太正确的,至少通过我阅读IE8调试器告诉我的内容。这更像是解释器将对全局变量的隐式引用(本例中为“c
IE非常乐意为每个具有“id”值的页面元素创建窗口的属性。这只是一件事。(注意:这句话不是真的。)
编辑-是,元素没有“id”。好吧,好消息-IE也将引用人的名字视为“id”。回想一下,该页面上的document.getElementById(“cd”)
将返回对
的引用,就像它有一个“id”元素一样
再次编辑我认为说IE实际上创建了窗口
属性是不太正确的,至少通过我阅读IE8调试器告诉我的内容。这更像是解释器将对全局变量的隐式引用(本例中为“cd”)视为请求它在全局页面上下文中以该名称查找某些内容。对于IE来说,该过程包括检查DOM中是否有具有该“id”或“name”值的元素。通过使用var
关键字,您明确地告诉解释器您正在适用范围(此处为全局)中声明一个符号,以便跳过“查找”过程。当您不使用var说明符声明变量时,变量cd将作为属性添加到窗口对象中,例如window.cd
。您已经有一个对象元素,它是已键入的a
窗口的子元素。无法将新日期指定为此对象的类型,因为它已存在。使用var关键字时,将变量重新缩放到本地范围,并删除其与窗口对象的直接附件。这将删除错误并允许IE继续。其他浏览器引擎对此的处理方式不同。//
Firefox不会自动为具有ID或名称的元素定义全局变量。
包括#9、Opera 10、Safari 5和Chrome 6在内的IE都保持着全球领先地位
文档中已命名或id为的元素的rollcall
看起来它可能会挤满全局名称空间
function a1(id){
try{
window[id].style.color= 'red';
}
catch(er){
return er.message+'\n'+'window.'+id+' = '+window[id];
}
return 'window.'+id+'='+window[id];
}
function a2(id){
window[id]= 'red';
return 'window.'+id+'='+window[id]
}
/*
firefox返回窗口[idstring]未定义
其他人都找到了它,就像旧的IE文档.all对象一样
- 将id查询为全局标识符:
警报(a1('idstring'))
- 为全局变量分配一个新值:警报(a2('idstring'))返回“红色”
- 再次尝试元素警报(a1('idstring'))
- 引发错误-无法将“窗口[id].style”转换为对象
- 或无法设置未定义的或
- 表达式“窗口[id]。样式“[undefined]”的结果不是对象
- 预期对象
*/仍然不能完全解开谜团,是吗?为什么它与var
一起工作?试试看。。。捕捉块有自己的作用域吗?我一直以为他们没有t@Pekka-try块与函数不匹配。当您不使用var来声明时,变量会自动作用于window.variable(全局)。如果不使用try-catch,则会应用相同的差异。[var cd=Date]在[cd=Date]抛出错误时起作用,因此它与try-catch作用域无关。@Pointy-他没有使用id作为锚定。他在使用name。@Joel说得通,但我在示例中没有看到函数?代码是在全局上下文中运行的,不是吗?对象不支持此属性或方法name属性的行为是否类似于IE中的id?@vinnybozz-据我所知(尽管我没有寻找文档来备份它),name属性会自动将dom中的对象绑定到window对象。因此,将一个div放入一个具有名称的页面中,您可以使用类似“window.myDiv.innerText”的方式调用其属性。看起来,var用于将cd属性重新声明为新类型。当我没有声明任何cd变量时,window.cd将返回该名称的元素。通过添加[var cd=new Date],现在window.cd包含[Wed Oct 13 11:15:00 EDT 2010]。通过删除var并只留下[cd=newdate](如示例中所示),将抛出一个错误。
colors the element red and returns[object HTMLButtonElement]
(returns [object Object] in older ie browsers)