2012-03-25 5 views
4

Однажды я видел пример, как это:Можно ли использовать с()?

var a, x, y; 
var r = 10; 
with (Math) { 
    a = PI * r * r; 
    x = r * cos(PI); 
    y = r * sin(PI/2); 
} 

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

Но когда я смотрю на MDN, он говорит:

Использование with не рекомендуется, и запрещено в ECMAScript 5 строгого режима. Рекомендуемая альтернатива - назначить объект, свойства которого вы хотите получить во временную переменную.

Как это нормально использовать with()? В HTML5?

+0

Определите «хорошо». Если вы имеете в виду «рекомендуется», то нет (по крайней мере, одним хорошим источником), и вы указали доказательства. Если вы имеете в виду «будет ли это работать», возможно, это зависит от того, используете ли вы строгий режим или нет. – Quentin

+3

Этот вопрос не заслуживает проголосовать – Ben

+2

BTW HTML 4 или 5 не имеет значения. Javascript/ECMAScript не является частью HTML. –

ответ

4

MDN вы связаны говорит Using with is not recommended ...
with является отличным способом сделать спагетти код на обед.

Вам может понравиться, но парень, который должен будет отладить его, проклинает вас.

javascript имеет некоторые очень странные операторы, такие как оператор запятой (,).
Вы понимаете, что делает следующий код?

var a = "a"; 
var b = "b"; 
a = [b][b = a,0]; 

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


When is the comma operator useful?
The comma swap Fiddle

+0

Что ... o.O Что делают 'a = [b] [b = a, 0];' do? –

+0

Я не понимаю ... '[b] [b = a, 0]' wtf ... это? –

+1

@ Derek. Проверьте обновленную скрипту. Он меняет 'a' и' b'. Теперь вы понимаете, почему я прав ...? хаки классные, но не в реальном коде! – gdoron

3

Вполне возможно использовать любую функцию JavaScript, , если вы это понимаете..

Например, с помощью with вы можете получить доступ к существующим свойства объекта, но вы не можете создавать новые.

Обратите внимание:

var obj = {a:1,b:2}; 
with(obj) { 
    a = 3; 
    c = 5; 
} 
// obj is now {a:3,b:2}, and there is a global variable c with the value 5 

Это может быть полезно для сокращения кода, такие как:

with(elem.parentNode.children[elem.parentNode.children.length-3].lastChild.style) { 
    backgroundColor = "red"; 
    color = "white"; 
    fontWeight = "bold"; 
} 

Поскольку свойства style объекта уже существуют.

Я надеюсь, что это объяснение достаточно ясное.

+4

«Вполне возможно использовать любую функцию JavaScript, если вы ее понимаете». ... и являются единственным человеком, который когда-либо будет его поддерживать. – Quentin

+0

@Quentin. Забавно, я просто добавил это замечание к моему ответу. ** lol ** – gdoron

+0

Но почему они не рекомендовали 'with()'? –

2

В своей замечательной книге "Javascript: The Good Parts", Дуглас Крокфорд перечисляет "с Заявлением" в Приложении B: плохие части.

Он говорит: «К сожалению, его результаты иногда могут быть непредсказуемыми, поэтому его следует избегать».

Далее он приводит пример, в котором назначение внутри оператора будет работать с различными переменными в зависимости от того, определен ли объект или нет.

См. With statement considered harmful (но менее подробно, чем объяснение в книге).

Смежные вопросы