Когда неопределенная переменная выбрасывает Uncaught TypeError вместо того, чтобы просто иметь значение undefined? - PullRequest
0 голосов
/ 02 октября 2018

В основном, в коде, который я редактирую, есть функция, которая получает аргумент объекта, который имеет 2 возможные пары ключ / значение, но только один из них используется в зависимости от некоторых условий:

Это функция, которая разрушает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
}

Здесь мы передаем аргумент foobar someFunction():

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

Здесь аргумент foobarпроисходит, и его значение зависит от некоторого условия:

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

Но иногда, если у меня где-то есть неопределенная переменная, я получаю Uncaught TypeError: Cannot read property of undefined, и программа вообще не запускается.

Например, когда я вызываю someFunction(foobar), я ожидал получить Uncaught TypeError, потому что определенно одна из переменных будет undefined.Однако здесь функция по-прежнему выполняется.

Почему это так?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Многие языки программирования спроектированы по принципу, что если фрагмент кода вряд ли будет вести себя так, как задумано, то пискать как можно скорее предпочтительнее, чем просто позволить коду вести себя непреднамеренно.Хотя многие аспекты JavaScript бесполезны в этом отношении, диалект "use strict" пытается предложить помощь в некоторых случаях, когда это возможно.

Описанная здесь ситуация является особенно важной в этом отношении, потому чтона не "use strict" диалекте попытка использовать переменную в функции, где она не определена, имеет допустимое заданное значение (создать переменную во внешнем контексте), на которое иногда полагаются.Хотя в некоторых ситуациях "use strict" приводит к тому, что код с одним допустимым значением вместо этого имеет другое допустимое значение, большинство из них не возникло бы слишком часто.Если значение кода, который пытается использовать переменную, которая не определена в функции, было изменено для создания переменной в этой функции, код, который опирается на старое поведение, перестал бы работать без какой-либо диагностики, указывающей, почему.

0 голосов
/ 02 октября 2018

Неопределенные переменные - это именно то, что: переменные, имена , которые вы использовали в своем коде, но о которых среда выполнения не знает, на что они должны ссылаться, потому что вы никогда не вводили это имя переменной.

Здесь вы явно вводите foo и bar в качестве параметров функции .Для среды выполнения ясно, откуда берутся эти переменные, какова их область действия и т. Д. Просто им не присвоено значение / они содержат значение undefined. Неопределенные переменные - это переменные, на которые вы вдруг ссылаетесь, не объявляя их где-либо с var, let, const или в качестве параметров функции.Например:

console.log(foo);

Я никогда не определял, что такое foo, откуда оно или каково его значение, поэтому это ошибка.

...