代码之家  ›  专栏  ›  技术社区  ›  catandmouse

什么时候一个未定义的变量会抛出一个未捕获的TypeError而不是仅仅有一个值'undefined'?

  •  0
  • catandmouse  · 技术社区  · 6 年前

    基本上在我正在编辑的代码中,有一个函数接收一个对象参数,该参数有两个可能的键/值对,但根据某些条件只能使用其中一个:

    这是分解 foobar 插入各个键:

    function someFunction({ foo, bar }) {
      console.log(foo); // can be either { foo: "123"} or undefined
      console.log(bar); // can be either { bar: "321"} or undefined
    }
    

    这是我们经过的地方 福巴 someFunction()

    function anotherFunction(foobar) {
      console.log(foobar); // can be either { foo: "123"} or { bar: "321"}
      someFunction(foobar);
    }
    

    这就是 福巴

    if(someConditionIsMet) {
      anotherFunction({ foo: "123"});
    } else {
      anotherFunction({ bar: "321"});
    }
    

    但有时,如果我有一个未定义的变量,我会得到一个 Uncaught TypeError: Cannot read property of undefined 程序根本不会运行。

    someFunction(foobar) ,我希望得到一个未捕获的TypeError,因为其中一个变量肯定是 undefined . 但是,在这里函数仍然运行。

    为什么会这样?

    2 回复  |  直到 6 年前
        1
  •  1
  •   deceze    6 年前

    姓名 ,但运行时不知道它应该引用什么,因为您从未 介绍 那个变量名。

    这就是你要介绍的 foo bar 函数参数 undefined . 未定义变量 var , let , const ,或作为函数参数。例如。:

    console.log(foo);

    我从来没有定义过什么 是,它来自哪里,或者它的值应该是什么,所以这是一个错误。

        2
  •  0
  •   supercat    6 年前

    许多编程语言的设计原则是,如果一段代码不太可能按预期的方式运行,那么最好尽快发出嘎嘎声,而不是简单地让代码以非预期的方式运行。尽管JavaScript的许多方面在这方面没有帮助,但是 "use strict" 方言试图在某些情况下提供帮助,如果它能够这样做。

    这里所描述的情况在这方面是一个特别重要的情况,因为在非政府组织中- “严格使用” “严格使用” 会导致只有一个有效含义的代码具有不同的有效含义,大多数代码不会频繁出现。如果试图使用未在函数中定义的变量的代码的含义被更改为在该函数中创建变量,则依赖于旧行为的代码将停止工作,而没有任何诊断指示原因。