Вы можете использовать операторы 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
этого не делает — меньшая гибкость иногда является преимуществом.
person
Wladimir Palant
schedule
04.07.2011
with
для обзора? - person Juan Mendes   schedule 29.06.2011