Почему «неопределенный» в этом коде? - PullRequest
0 голосов
/ 05 июля 2018

var a = 10;

function Obj() {
  console.log(a);
  let a = 10;
}

Obj()

при вызове функции. Значение aj печатается как неопределенное

Ответы [ 8 ]

0 голосов
/ 29 мая 2019

var a = 10;

function Obj() {
  console.log(a);
  let a = 10;
}

Obj()

Функция также является объектом и по своим свойствам, во-первых, a: undefined вы выполняете чтение undefined (читайте о подъеме в javascript!).

0 голосов
/ 05 июля 2018

Прежде всего вам необходимо понять, что переменные, объявленные с let, имеют область видимости блока. И вы не можете снова объявить ту же переменную в той же области видимости, это приведет к ошибке.
В вашем случае вы объявляете a в конце своей функции. Так что это еще не объявлено.

Вместо использования var для объявления переменной она не выдаст такую ​​ошибку, а вернет undefined.

Для лучшего понимания концепций let вы можете перейти по следующей ссылке.

  1. пусть переменная
  2. переменная переменная
0 голосов
/ 10 июля 2018

Здесь в вашем случае код ломается на первой консоли. Поскольку область действия a находится внутри функции, и вы не определили ее перед печатью.

Я сделал несколько примеров, чтобы показать вам разные сценарии инициализации.

const derp = 10

const blerg = (derp) => {
 console.log('Checking case1: ', derp)
 //Reason: Here derp is the prop passed to the function and passed undefined to it.
}

const blerg2 = (derp) => {
 console.log('Checking case2: ', derp)
 //Reason: Here derp is the prop passed to the function
}

const blerg3 = () => {
 console.log('Checking case3: ', derp)
 // Throws Error
 //Reason: Here derp scope is within the function and not defined so far.
let derp = 20
console.log('Checking case4: ', derp)
// This line won't print because already code broke on the above console.
}

blerg()
blerg2(derp) // Passing the derp initialised on line 1
blerg3() // Passing nothing to the function
0 голосов
/ 05 июля 2018

Когда вы вызываете функцию Obj(). Движок JavaScript будет читать это как ниже-

function Obj() { 
    let a;  //variable hoisting

    console.log(a); 

    a = 10;     
}

Таким образом, без переменной инициализации переменной значение будет неопределенным.

0 голосов
/ 05 июля 2018

а не является неопределенным. Функция возвращает неопределенное значение, поскольку вы не указали, что должно возвращаться. На самом деле он возвращает ошибку, но если он запустится, вы увидите, что это неопределено

Код все вместе дает вам:

Uncaught ReferenceError: a не определено

Из-за областей действия в локальной области видимости функции a определяется позже с помощью let, который переопределяет определение перед функцией.

Вы можете попробовать две вещи:

  • Если вы попробуете console.log(window.a), вы получите правильное значение (внешнее значение a, определенное вне области действия функции).

  • Если вы переместите let a = 10; в начало функционального блока, вы получите это значение.

0 голосов
/ 05 июля 2018

Доступ к значениям let и const до их объявления может вызвать ошибку ReferenceError из-за временной мертвой зоны

0 голосов
/ 05 июля 2018

Javascript использует цепочки областей действия, чтобы установить область действия для данной функции. Обычно существует одна глобальная область, и каждая определенная функция имеет свою собственную вложенную область. Любая функция, определенная в другой функции, имеет локальную область видимости, которая связана с внешней функцией. Это всегда позиция в источнике, который определяет область действия.

Элементом в цепочке областей действия в основном является Карта с указателем на родительскую область.

При разрешении переменной javascript начинается с самой внутренней области и выполняет поиск за ее пределами.

Ваш пример запускается, если вы напишите его так:

console.log(this.a);
0 голосов
/ 05 июля 2018

Функции без какого-либо возвращаемого значения, по умолчанию возвращают undefined.

Ваша функция Obj запустится и выведет журнал консоли, но вернет undefined. Значение «возвращаемое значение функции не определено».

Отметьте это, если вы новичок в JS :) https://www.w3schools.com/js/js_mistakes.asp

...