【问题标题】:Difference TypeError and ReferenceError区别 TypeError 和 ReferenceError
【发布时间】:2012-09-17 08:25:02
【问题描述】:

有什么区别

TypeError: ... is undefined

ReferenceError: ... is not defined

?

【问题讨论】:

  • ECMAScript 标准定义了每种错误类型发生的场景。 See here 获取这些场景的完整列表。
  • 您能否提供引发这些错误的代码示例?

标签: javascript firefox typeerror referenceerror


【解决方案1】:

当您尝试使用根本不存在的变量时会出现ReferenceError

当变量存在时会出现TypeError,但您尝试执行的操作不适合它包含的值的类型。在详细消息显示“未定义”的情况下,如果您有一个值为特殊 undefined 值的变量,并且您尝试访问它的属性,则会发生这种情况。

请参阅http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/ 了解与此相关的一些讨论。

【讨论】:

    【解决方案2】:

    这里是JavaScript error types

    JavaScript 1.5 规范定义了六种主要错误类型,如下所示:

    EvalError: 当 eval() 函数以不正确的方式使用时引发。

    RangeError:当数值变量超出其允许范围时引发。

    ReferenceError:在使用无效引用时引发。

    SyntaxError:在解析 JavaScript 代码时发生语法错误时引发。

    TypeError:当变量的类型不符合预期时引发。

    strong text URIError:encodeURI()decodeURI() 函数以不正确的方式使用时引发。

    【讨论】:

      【解决方案3】:

      考虑以下代码:

      function foo(){
       var d=1234;
       console.log(d.substring(1,2));     
      }
      foo();
      

      这将有以下输出:

      异常:TypeError:d.substring 不是函数 这是因为我们为给定的操作(期望字符串的子字符串)使用了错误的类型(数字)。当值不是期望的类型时,TypeError 对象表示错误。

      function foo(){
       var d=1234;
       console.log(c);
      }
      foo();
      

      这将有以下输出:

      异常:ReferenceError:c 未定义 这是因为变量“c”的引用在本地或全局范围内都不存在,我们仍在尝试使用它。访问不存在的变量时会引发 ReferenceError 异常。

      【讨论】:

        【解决方案4】:

        引用错误是范围解析失败错误。在 TypeError 中,作用域解析成功,但我们尝试执行 对变量的非法操作是不允许的。

        以下示例将清楚地说明这两种类型的错误。

        function foo(a){
            console.log(a+b);//ReferenceError b is not defined
            b=a;
        }
        foo(2);
        

        执行上述函数会导致 TypeError,因为在编译器到达 console.log(a+b) 语句时,未定义 b, 注意 b 没有用 var 关键字声明。

        现在考虑下面的函数,

        function foo(a){
            console.log(a+b);
            var b=a;
        }
        foo(2);//NaN
        

        上述函数执行时,编译器会提升变量b,在函数作用域内,编译后的函数如下所示

        function foo(a){
            var b;//--> b has a value of undefined at this point
            console.log(a+b);
            b=a;
        }
        foo(2);//NaN
        

        当引擎执行 console.log(a+b) 时,此时 a 的值为 2 而 b 的值为 undefined 因此其日志南。 正如下面的表达式计算为 NaN

        2 + undefined;// evaluates to NaN
        

        现在来到 TypeError,考虑下面的代码块,像往常一样,我们将使用函数 foo。

        function foo(a){
        console.log(a+b.toString()); //TypeError Cannot read property 'toString' of undefined
        var b = a;
        }
        foo(2);
        

        按照上述逻辑,在变量 b 被提升后,编译器将函数转换为如下代码所示

        function foo(a){
        var b ;// b has a value of undefined at this point
        console.log(a+b.toString()); //TypeError is thrown
        b= a;
        }
        foo(2);
        

        在函数的范围内,变量b 被提升,因此在console.log(a+b.toString()) 行之前有一个未定义的值。在这一行中,我们尝试将此时未定义的 b 转换为字符串,这样做,我们尝试进行非法操作,因此抛出 TypeError。变量 b 的范围查找成功,但我们执行了非法操作。因此抛出了 TypeError。

        【讨论】:

          【解决方案5】:

          查看上面关于引用错误的解释是什么可能导致此代码的引用错误 常量 arr = [1,2,3,4,5,6,7,8,9,10] 让 B = [[(arr[1] = arr[8])],[(arr[8] = arr[1])]]

          【讨论】:

          • 从上面的问题我试图交换两个数组的位置,当我 console.log(arr) 消息是参考错误
          • 请考虑提出一个新问题。
          猜你喜欢
          • 2014-12-28
          • 2020-12-11
          • 1970-01-01
          • 2011-03-19
          • 2013-08-07
          • 2011-10-20
          • 2020-01-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多