Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
奇怪的IE错误-JavaScript全局变量和具有name属性的元素之间_Javascript_Internet Explorer - Fatal编程技术网

奇怪的IE错误-JavaScript全局变量和具有name属性的元素之间

奇怪的IE错误-JavaScript全局变量和具有name属性的元素之间,javascript,internet-explorer,Javascript,Internet Explorer,我在IE6、IE7和IE8中测试了以下代码,结果相同: IE非常乐意为每个具有“id”值的页面元素创建窗口的属性。这只是一件事。(注意:这句话不是真的。) 编辑-是,元素没有“id”。好吧,好消息-IE也将引用人的名字视为“id”。回想一下,该页面上的document.getElementById(“cd”)将返回对的引用,就像它有一个“id”元素一样 再次编辑我认为说IE实际上创建了窗口属性是不太正确的,至少通过我阅读IE8调试器告诉我的内容。这更像是解释器将对全局变量的隐式引用(本例中为“c

我在IE6、IE7和IE8中测试了以下代码,结果相同:


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)