Что делает «с» в JavaScript? - PullRequest
19 голосов
/ 29 марта 2010

Я видел код JavaScript, который начинается с with. Это немного сбивает с толку. Что он делает и как его правильно использовать?

with (sObj) return options[selectedIndex].value;

Ответы [ 8 ]

22 голосов
/ 29 марта 2010

Это добавляет к объему операторов, содержащихся в блоке:

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 на самом деле довольно неплохо объясняет вещи чуть более подробно (вместе с плюсами и минусами использования):

с - Центр разработчиков Mozilla

10 голосов
/ 29 марта 2010

оператор with - это чистый синтаксический сахар, но он также может вызвать некоторые неприятные ошибки.

См. с утверждением, которое считается вредным для уточнения:

Если вы не можете прочитать программу и уверены, что знаете, что она собирается делать, вы не можете быть уверены, что она будет работать правильно. По этой причине следует избегать оператора with.

2 голосов
/ 29 марта 2010

Это эквивалент

return sObj.options[selectedIndex].value;

With позволяет вам выдавать блок операторов в контексте определенного объекта. Поэтому все операторы в блоке with считаются членами объекта в скобках.

Это может иногда сделать код более читабельным, , но , это также может привести к неоднозначности, поскольку ссылки на переменные могут быть либо с sObj, либо с глобальными.

законное использование для выражения "with" в javascript : D

2 голосов
/ 29 марта 2010

В этом блоке вам не нужно вводить:

sObj.options[selectedIndex].value

но вы можете просто использовать:

options[selectedIndex].value
1 голос
/ 29 марта 2010

Ваш пример может быть переписан как ...

return sObj.options[selectedIndex].value;

... поскольку оператор 'with' помещает все связанные операторы в область предоставленного объекта. В этом случае это довольно бессмысленно, но, если вы выполняли много операций с sObj, это экономит много времени на печатание.

Полностью вымышленный пример ..

with (sObj) 
{
   if(options[selectedIndex].value < 10){
       options[selectedIndex].value++;
       total+ = options[selectedIndex].value;
   }
}

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

1 голос
/ 29 марта 2010

Это не функция (как было указано в заголовке вопроса до того, как она была отредактирована), а утверждение. Это может иметь больше смысла, если пример кода отформатирован так:

with (sObj){
    return options[selectedIndex].value;
}

Относительно того, что он делает ( Источник )

Оператор with устанавливает объект по умолчанию для набора операторов. JavaScript просматривает любые неквалифицированные имена в наборе операторов, чтобы определить, являются ли имена свойствами объекта по умолчанию. Если неквалифицированное имя соответствует свойству, то это свойство используется в выражении; в противном случае используется локальная или глобальная переменная.

Это означает, что в примере кода сначала проверяется, является ли options свойством sObj. Если это так, options относится к sObj.options, в противном случае он проверяет другие области на наличие переменной, определенной именем options

Недостатком использования оператора with является то, что невозможно узнать, просто взглянув на код, к которому осуществляется доступ. Есть и другие лучшие альтернативы, как показано в этой статье

1 голос
/ 29 марта 2010

Я бы порекомендовал НЕ использовать это из-за проблем с производительностью, но что выше означает:

для объекта sObj (здесь, по-видимому, элемент выбора), все дочерние элементы и свойства, на которые есть ссылки на этом (или между следующими фигурными скобками), рассматривают его как родительскую область.

0 голосов
/ 29 марта 2010
...