Вы можете использовать операторы with
и let
для достижения одной и той же цели, но я вижу здесь два существенных различия.В конце концов, оператор let
является новой редакцией оператора with
с устранением недостатков последнего.
Производительность : В случае оператора with
выдобавить дополнительный объект JavaScript в цепочку областей действия.Это не маленькая цена, вы должны помнить, что объекты имеют потенциально длинную цепочку прототипов, и поэтому, чтобы найти переменную, движок JavaScript сначала должен найти объект и все его прототипы.С другой стороны, для оператора let
движку нужно искать не более одного дополнительного объекта.Оператор let
действительно может быть реализован без каких-либо накладных расходов, поскольку все переменные, объявленные в операторе let
, известны во время компиляции, и механизм JavaScript может легко оптимизировать код, например, обработав ваш пример следующим образом:
var x = 10;
var let1x = x * 10;
var let1y = x + 5;
{
console.log("x is " + let1x + ", y is " + let1y);
}
Удобочитаемость кода : Как уже упоминалось выше, оператор let
всегда делает все объявления видимыми во время компиляции, это предотвращает такой код:
with (foo)
{
console.log("x is " + x + ", y is " + y);
}
Если вы посмотрите на код выше, что такое x
и что такое y
?Являются ли они функциональными переменными или свойствами объекта foo
?Вы не можете сказать это, не зная, что такое foo
- и это может отличаться для разных вызовов одной и той же функции.Что является основной причиной, по которой оператор with
устарел.Хотя вы можете использовать его так же, как в своем вопросе (и это хорошо), он также допускает очень сомнительные и нечитаемые конструкции кода.let
утверждение не делает - иногда гибкость иногда является преимуществом.