Я видел код JavaScript, который начинается с with
. Это немного сбивает с толку. Что он делает и как его можно использовать правильно?
with (sObj) return options[selectedIndex].value;
Я видел код JavaScript, который начинается с with
. Это немного сбивает с толку. Что он делает и как его можно использовать правильно?
with (sObj) return options[selectedIndex].value;
Это добавляет к объему операторов, содержащихся в блоке:
return sObj.options[selectedIndex].value;
может стать:
with (sObj)
return options[selectedIndex].value;
В вашем случае это не так уж и много... но учтите следующее:
var a, x, y;
var r = 10;
a = Math.PI * r * r;
x = r * Math.cos(PI);
y = r * Math.sin(PI /2);
становится:
var a, x, y;
var r = 10;
with (Math) {
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI / 2);
}
... сохраняет пару нажатий клавиш. Документация Mozilla на самом деле довольно неплохо объясняет вещи чуть более подробно (наряду с плюсами и минусами использования):
оператор with
- чистый синтаксический сахар, но он также может вызывать некоторые неприятные ошибки.
См. с выражением, которое считается вредным для уточнения:
Если вы не можете прочитать программу и уверены, что знаете, что она собирается делать, вы не можете быть уверены, что она будет работать правильно. По этой причине следует избегать оператора
with
.
В том, что с блоком вам не нужно вводить:
sObj.options[selectedIndex].value
но вы можете просто использовать:
options[selectedIndex].value
Его эквивалент
return sObj.options[selectedIndex].value;
With
позволяет вам выдать блок операторов в контексте конкретного объекта. Поэтому все утверждения в блоке With
считаются членами объекта в скобках.
Это может сделать код более читаемым в разы, , но, что также может привести к двусмысленности, поскольку ссылки на переменные могут быть либо с sObj, либо с глобальным.
Я бы рекомендовал НЕ использовать это из-за проблем с производительностью, но что это означает:
для объекта sObj (здесь предположительно элемент select), все дочерние элементы и свойства, указанные на этом (или между следующими фигурными фигурными скобками), рассматривают это как их родительскую область.
Это не функция (как указано в заголовке вопроса до ее редактирования), но утверждение. Это может иметь большее значение, если образец кода отформатирован следующим образом:
with (sObj){
return options[selectedIndex].value;
}
Относительно того, что он делает (Источник)
Оператор with устанавливает объект по умолчанию для набора операторов. JavaScript ищет любые неквалифицированные имена в наборе операторов, чтобы определить, являются ли имена свойствами объекта по умолчанию. Если неквалифицированное имя соответствует свойству, то свойство используется в инструкции; в противном случае используется локальная или глобальная переменная.
Это означает, что в образце кода сначала проверяется, является ли options
свойством sObj
. Если он тогда options
относится к sObj.options
, в противном случае он проверяет другие области для переменной, определяемой именем options
Недостатком использования инструкции with
является то, что невозможно понять, просто взглянув на код, к которому обращаются. Существуют и другие альтернативы, как показано в в этой статье
Ваш пример можно переписать как...
return sObj.options[selectedIndex].value;
..., поскольку оператор 'with' помещает все связанные операторы в область действия объекта. В этом случае это довольно бессмысленно, но если вы делаете много операций над 'sObj', тогда это экономит много ввода.
Полностью фиктивный пример.
with (sObj)
{
if(options[selectedIndex].value < 10){
options[selectedIndex].value++;
total+ = options[selectedIndex].value;
}
}
Но, сказав это, часто бывает, что сохранение типизации может быть достигнуто лучшими способами.