Преимущества использования let over var в функции

Скажем, у меня есть такой фрагмент кода:

const number = 3;

function fooFunction() {
  let numberTwo = 5;
  var answer = number + numberTwo;
  return answer;
}

finalAnswer = fooFunction();

console.log(finalAnswer);

Предполагая, что браузер совместим с ES2015, каковы будут преимущества / недостатки использования приведенного выше кода по сравнению с:

const number = 3;

function fooFunction() {
  var numberTwo = 5;
  var answer = number + numberTwo;
  return answer;
}

finalAnswer = fooFunction();

console.log(finalAnswer);

Есть ли какие-либо преимущества или недостатки, учитывая, что они оба возвращают один и тот же номер?


person Peter David Carter    schedule 20.05.2016    source источник
comment
Согласно этому ответу они идентичны в рамках такой функции, как ваша.   -  person Soren    schedule 20.05.2016
comment
А что насчет безопасности и производительности?   -  person Peter David Carter    schedule 20.05.2016
comment
В соответствии с вашим использованием выше нет никакой разницы.   -  person mferly    schedule 20.05.2016
comment
Если бы была разница в безопасности или производительности, они не были бы идентичными.   -  person Soren    schedule 20.05.2016
comment
Как насчет безопасности и производительности? Разница между let и var заключается в области действия. Не производительность.   -  person mferly    schedule 20.05.2016
comment
это просто область видимости (var - это область действия, пусть - область действия блока). Компилятор позаботится о подъеме и оптимизации.   -  person Joe Hanink    schedule 20.05.2016
comment
Верно. Однако мне кажется, что функция let была бы более безопасной, поскольку данные не были бы доступны вне функции. Это правильно или неправильно? Если нет, то почему это не имеет значения? Кроме того, не снижает ли производительность подъемные механизмы? Я бы так и подумал.   -  person Peter David Carter    schedule 20.05.2016
comment
var - это область действия функции, которая не видна вне функции. let, поскольку область видимости блока означает, что она не обязательно видна во всей функции, но они оба являются локальными для вашей функции ...   -  person Joe Hanink    schedule 20.05.2016
comment
В вашем примере var answer недоступен за пределами блока fooFunction().   -  person mferly    schedule 20.05.2016
comment
Однако var переменные поднимаются за пределы области действия функции и доступны интерпретатору на глобальном уровне, а let - нет. Это не так?   -  person Peter David Carter    schedule 20.05.2016
comment
нет, var поднимается наверх функции, а не вне функции :)   -  person Joe Hanink    schedule 20.05.2016
comment
Но, конечно, если переменная, определенная let, остается неинициализированной вне функции, в которой она вызывается, что, кажется, имеет место, это более безопасно, чем var, поскольку данные недоступны для чего-либо, кроме функции сам?   -  person Peter David Carter    schedule 21.05.2016


Ответы (2)


Как уже упоминалось, в вашем примере вы можете использовать let и var взаимозаменяемо. Разница в том, что let имеет блочную область видимости, а var - нет.

Например, с var вы можете сделать это (печатает 'foo'):

function printFoo(param) {
  if (param) {
    var x = "foo";
  }

  console.log(x);
}

printFoo("hello");

Вы не можете сделать это с let, потому что let x привязан к блоку if и поэтому не определен.

person Jared    schedule 20.05.2016

В предоставленном вами примере кода они взаимозаменяемы. Где let пригодится, так это в ограничении области действия на уровне блока, а не на уровне функции. Например, использование let внутри цикла for.

Стоит отметить, что переменные, созданные с помощью ключевого слова var, поднимаются, тогда как переменные, созданные с помощью ключевого слова let, не поднимаются.

В блоге Дэвида Уолша Кайл Симпсон прекрасно разобрал эту тему: https://davidwalsh.name/for-and-against-let#implicit-hazards

person SimianAngel    schedule 20.05.2016
comment
технически let переменные подняты, но на них нельзя ссылаться. см. временную мертвую зону. In ECMAScript 2015, let will hoist the variable to the top of the block. However, referencing the variable in the block before the variable declaration results in a ReferenceError. The variable is in a "temporal dead zone" from the start of the block until the declaration is processed. - person Joe Hanink; 20.05.2016
comment
(см. Переменные, объявленные с помощью let или const, не поднимаются в ES6? для более подробного обсуждения) - person Bergi; 21.05.2016