我在IE6,IE7和IE8中测试了以下代码,结果相同:
<a name="cd"/>a</a>
<script>
try {
cd = new Date;
} catch(e) {
alert(e);
}
</script>
在所有情况下都会引发错误。但是使用
var cd = new Date;
似乎解决了这个问题 有谁知道为什么会这样?
以下是一个示例:http://jsbin.com/ahuhu4/2
答案 0 :(得分:6)
如果不使用var说明符来声明变量,则将变量cd作为属性添加到窗口对象,例如, window.cd
。您已经有一个对象元素,它是已经键入的<a name="cd">a</a>
窗口的子对象。您不能将新Date指定为此对象的类型,因为它已存在。使用var关键字时,您将该变量重新调整为局部范围并删除其对窗口对象的直接附件。这将删除错误并允许IE继续。其他浏览器引擎处理的方式不同。
答案 1 :(得分:3)
IE非常适合为每个具有“id”值的页面元素创建window
的属性。这只是一件事。 (注意:这句话不是真的。)
编辑 - 是的,该元素没有“id”。好的,好消息 - IE也会按照名称来处理引用,就好像它们是“id”一样。回想一下,该页面上的document.getElementById("cd")
将返回对<a>
的引用,就像它具有“id”元素一样。
再次编辑我认为说IE创建实际window
属性并不完全正确,至少通过我阅读IE8调试器告诉我的内容。它更像是解释器将对全局变量的隐式引用(在本例中为“cd”)视为请求它通过该名称在全局页面上下文中查找某些内容。对于IE,该过程包括检查具有“id”或“name”值的元素的DOM。通过使用var
关键字,您明确告诉解释器您在适用范围(全局,此处)中声明了一个符号,以便跳过“查找”过程。
答案 2 :(得分:0)
// Firefox不会自动为具有ID或名称的元素定义全局变量。 包括#9,Opera 10,Safari 5和Chrome 6在内的IE都保持全球化 滚动文档中的named或id'd元素。
似乎它可以挤占全局命名空间......
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 document.all对象一样。
警报(A1( 'idstring'))
colors the element red and returns[object HTMLButtonElement]
(returns [object Object] in older ie browsers)
为全局分配一个新值:alert(a2('idstring'))返回'red'
再次尝试元素警报(a1('idstring'))
抛出错误 - 无法将'window [id] .style'转换为对象
* /