Javascript 为什么IE6中出现JS错误(不是var变量)

Javascript 为什么IE6中出现JS错误(不是var变量),javascript,internet-explorer,Javascript,Internet Explorer,我编写了以下代码 <html> <body> <img id="img" src="http://example.com/img.jpg" /> <script type="text/javascript"> //<![CDATA[ (function(){ img = document.getElementById("img"); img.src = "http://example.com/img.png";

我编写了以下代码

<html>
 <body>
   <img id="img" src="http://example.com/img.jpg" />
   <script type="text/javascript"> 
//<![CDATA[
(function(){
    img = document.getElementById("img");
    img.src = "http://example.com/img.png";
})();
  //]]>
</script> 
 </body>

//

但是在IE6上 出现了一些js错误

因为我应该使用var-img吗? 顺便说一句

     <body>
       <img id="img" src="http://example.com/img.jpg" />
       <script type="text/javascript"> 
    //<![CDATA[
    (function(){
        var img = document.getElementById("img");
        img.src = "http://example.com/img.png";
    })();
      //]]>
    </script> 
     </body>

</html>

//
没问题 我不知道为什么
你能解释一下吗?

在浏览器加载整个身体结构之前,脚本正在运行。因此,函数无法找到
img
元素。 在
onLoad
body事件中调用函数可以修复错误

即:


//

在浏览器加载整个车身结构之前,脚本正在运行。因此,函数无法找到
img
元素。 在
onLoad
body事件中调用函数可以修复错误

即:


//

如果在声明变量时省略了
var
,并且该变量不存在于当前本地范围内,则会发生以下两种情况之一:

  • 您将声明一个新的“全局”变量,每个函数都有权访问该变量->不要这样做
  • 将已存在的全局变量设置为新值;如果其他函数依赖于此变量,则可能会造成严重破坏

  • 因此,不要使用全局变量,尽可能使用
    var
    。正如Tomas已经指出的,您的脚本可以在浏览器加载结构之前运行。

    如果您在声明变量时省略了
    var
    ,并且该变量不在当前本地范围内,则会发生以下两种情况之一:

  • 您将声明一个新的“全局”变量,每个函数都有权访问该变量->不要这样做
  • 将已存在的全局变量设置为新值;如果其他函数依赖于此变量,则可能会造成严重破坏

  • 因此,不要使用全局变量,尽可能使用
    var
    。正如Tomas已经指出的,您的脚本可以在浏览器加载结构之前运行。

    唯一的问题是您没有使用
    var
    来声明
    img
    变量。身体的其余部分可能没有被解析,这一事实没有问题,所以不用担心

    缺少
    var
    导致出现问题的原因是
    img
    与浏览器为您创建的全局对象的属性冲突。在IE中,每个具有ID的元素都会创建与该ID相对应的全局对象的属性(因此在任何地方都可以访问)。该属性是只读的,因此如果尝试将其赋值,就会出现错误。如果您首先声明它,您将创建一个新变量,它不会干扰IE的全局属性,并且它将按照您的预期工作

    您还会发现,更改变量名以使其不与
    窗口的ID或属性冲突将解决此问题:

    banana = document.getElementById("img");
    banana.src = "http://example.com/img.png";
    
    。。。但这也不是一个好主意,因为您的
    香蕉会自动污染全局范围,这可能会在其他代码中产生后果,并且在ECMAScript 5严格模式下,您会得到一个错误

    最后,除非您使用的是XHTML(您几乎肯定不应该使用XHTML,而且您的示例没有XHTML doctype),否则就不需要CDATA标记。你应该移除它


    这个故事的寓意是:始终声明变量

    唯一的问题是您没有使用
    var
    来声明
    img
    变量。身体的其余部分可能没有被解析,这一事实没有问题,所以不用担心

    缺少
    var
    导致出现问题的原因是
    img
    与浏览器为您创建的全局对象的属性冲突。在IE中,每个具有ID的元素都会创建与该ID相对应的全局对象的属性(因此在任何地方都可以访问)。该属性是只读的,因此如果尝试将其赋值,就会出现错误。如果您首先声明它,您将创建一个新变量,它不会干扰IE的全局属性,并且它将按照您的预期工作

    您还会发现,更改变量名以使其不与
    窗口的ID或属性冲突将解决此问题:

    banana = document.getElementById("img");
    banana.src = "http://example.com/img.png";
    
    。。。但这也不是一个好主意,因为您的
    香蕉会自动污染全局范围,这可能会在其他代码中产生后果,并且在ECMAScript 5严格模式下,您会得到一个错误

    最后,除非您使用的是XHTML(您几乎肯定不应该使用XHTML,而且您的示例没有XHTML doctype),否则就不需要CDATA标记。你应该移除它


    故事的寓意:始终声明变量

    感谢您的回复!真的吗?但是var-term-add这个脚本没有问题,你的代码很棒!但是我有没有其他不使用onload的解决方案,因为onload已经设置了另一个函数不,这绝对不是问题所在。问题是未使用
    var
    导致与
    img
    冲突。感谢您的回复!真的吗?但是var-term-add这个脚本没有问题,你的代码很棒!但是我有没有其他不使用onload的解决方案,因为onload已经设置了另一个函数不,这绝对不是问题所在。问题是未使用
    var
    导致与
    img
    冲突。