with

with ๋ฌธ์€ scope chain์„ ํ™•์žฅํ•œ๋‹ค.

syntax

with(expression) statement

expression : statement๋ฅผ ํ‰๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉ๋œ scope chain์— ์ฃผ์–ด์ง„ ํ‘œํ˜„์‹์„ ์ถ”๊ฐ€ํ•œ๋‹ค. ํ‘œํ˜„์‹ ์ฃผ๋ณ€์— {}๋Š” ํ•„์ˆ˜๋‹ค.

statement : Any statement. ์—ฌ๋Ÿฌ๊ฐœ์˜ statement๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด, ์—ฌ๋Ÿฌ๊ฐœ์˜ statements๋ฅผ ๊ทธ๋ฃจํ•‘ ํ•˜๊ธฐ ์œ„ํ•ด block statement๋ฅผ ์‚ฌ์šฉํ•ด๋ผ.

description

JS๋Š” ์‹คํ–‰ ์ปจํ…์ŠคํŠธ์—์„œ ์—ฐ๊ด€๋œ scope chain์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๋ณ€์ˆ˜ or ํ•จ์ˆ˜๋ฅผ ์ฐพ๋Š”๋‹ค.

with statement๋Š” statement ๋ณธ๋ฌธ์„ ํ‰๊ฐ€ํ•˜๋Š” ๋™์•ˆ ํ•ด๋‹น scope chain์˜ head(๊ฐ€์žฅ ์œ„์—?)์— ์ฃผ์–ด์ง„ object๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

๋งŒ์•ฝ ๊ฐ’์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ์ด๋ฆ„์ด scope chain์˜ ํ”„๋กœํผํ‹ฐ์™€ ๋งค์น˜๋œ๋‹ค๋ฉด, ๊ทธ ์ด๋ฆ„์€ ๊ทธ ํ”„๋กœํผํ‹ฐ์™€ ํ”„๋กœํผํ‹ฐ๋ฅผ ํฌํ•จํ•œ ์˜ค๋ธŒ์ ํŠธ์— ๋ฐ”์šด๋”ฉ๋œ๋‹ค.

๋งŒ์•ฝ scope chain์— ๋งค์น˜๋˜๋Š” ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๋‹ค๋ฉด, ReferenceError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

with ์‚ฌ์šฉํ•˜๊ธฐ๋Š” ์ถ”์ฒœ๋˜์ง€ ์•Š๋Š”๋‹ค. ES5 strict mode์—์„œ ์‚ฌ์šฉ ๊ธˆ์ง€ ๋˜์—ˆ๋‹ค. ์ถ”์ฒœํ•˜๋Š” ๋Œ€์•ˆ์€ ๋„ˆ๊ฐ€ ์ž„์‹œ ๋ณ€์ˆ˜๋กœ ์ ‘๊ทผํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ฐ€์ง„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

performance pro & contra

Pro

with statement๋Š” ์„ฑ๋Šฅ ํŽ˜๋„ํ‹ฐ ์—†์ด ๋งค์šฐ ๊ธด ์˜ค๋ธŒ์ ํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๋ฐ˜๋ณตํ•  ํ•„์š”๋ฅผ ๊ฐ์†Œ์‹œ์ผœ์„œ file size๋ฅผ ๊ฐ์†Œ์‹œ๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค. with์— ํ•„์š”ํ•œ scope chain ๋ณ€๊ฒฝ์€ ๊ณ„์‚ฐ์ ์œผ๋กœ ๋น„์šฉ์ด ๋“ค์ง€ ์•Š๋Š”๋‹ค. with์˜ ์‚ฌ์šฉ์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ๋ฐ˜๋ณต๋œ object ์ฐธ์กฐ๋ฅผ ํŒŒ์‹ฑ ํ•˜๋Š” ํšŸ์ˆ˜๋ฅผ ๊ฐ์†Œ์‹œํ‚จ๋‹ค..? ๊ทธ๋Ÿฌ๋‚˜, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—, ์›ํ•˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ด์ ์ด ์„ฑ์ทจ๋œ๋‹ค.

Contra

with statement๋Š” ๋ช…์‹œ๋œ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋ชจ๋“  ์ด๋ฆ„ ๊ฒ€์ƒ‰์—์„œ ์ฒซ๋ฒˆ์งธ๋กœ ๊ฒ€์ƒ‰๋˜๋„๋ก ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ช…์‹œ๋œ ์˜ค๋ธŒ์ ํŠธ์˜ ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ์‹๋ณ„์ž๋Š” with block์—์„œ ๋” ์ฒœ์ฒœํžˆ ๋ฐœ๊ฒฌ๋œ๋‹ค. ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๊ณณ์—์„œ with๋Š” ์ง€์ •๋œ ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ํฌํ•จํ•˜๋Š” ๋ฐ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. (์ƒ์œ„ scope์—์„œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ ์ถ”๊ฐ€ ์ฒ˜๋ฆฌ ์‹œ๊ฐ„ ์†Œ์š”๋œ๋‹ค,)

Ambiguity contra

Contra: with ๋ฌธ์€ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ์—๋„, js compiler๊ฐ€ unqualified ์ด๋ฆ„์„ scope chain์—์„œ ์ฐพ์„์ง€ ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ๊ฐ์ฒด์ธ์ง€ ๊ฒฐ์ •ํ•˜๊ธฐ์—๋„ ์–ด๋ ต๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž.

f๊ฐ€ ํ˜ธ์ถœ ๋์„ ๋•Œ, x๋Š” ์ฐพ์•„์งˆ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค.

๋งŒ์•ฝ ์ฐพ์•„์ง„๋‹ค๋ฉด o ์•ˆ์—์„œ ํ˜น์€ (๊ทธ๋Ÿฌํ•œ property๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด) x๊ฐ€ ์ฒซ๋ฒˆ์งธ ํ˜•์‹ ๋งค๊ฐœ๋ณ€์ˆ˜์ธ ๊ณณ f์˜ AO(activation object)์•ˆ์— ์žˆ๋‹ค.

๋งŒ์•ฝ 2๋ฒˆ์งธ ๊ฐ์ฒด๋กœ ํ†ต๊ณผ ์‹œํ‚จ ๊ฐ์ฒด ๋‚ด์—์„œ x๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์žŠ๋Š”๋‹ค๋ฉด

ํ˜น์€ ๋งŒ์•ฝ ๋น„์Šทํ•œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ์œผ๋ฉด ์—๋Ÿฌ๋ฅผ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ๋ผ. ๋‹จ์ง€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋‹ค.

Contra: with๋ฅผ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ํŠนํžˆ plain object๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ์‚ฌ์šฉ๋  ๋•Œ, ํ•˜์œ„ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž.

๋งŒ์•ฝ ECMAScript 5์—์„œ f([1,2,3], obj)๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋ฉด,

with๋ฌธ ๋‚ด์˜ values๊ฐ’ ์ฐธ์กฐ๊ฐ€ obj๋กœ ํ•ด์„๋œ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ECMAScript 6์€ values property๋ฅผ Array.prototype์œผ๋กœ ์†Œ๊ฐœํ•œ๋‹ค. (๊ทธ๋ž˜์„œ ๋ชจ๋“  array ์—์„œ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.)

๊ทธ๋ž˜์„œ ES6์„ ์ง€์›ํ•˜๋Š” JS ํ™˜๊ฒฝ ์•ˆ์—์„œ๋Š”, with๋ฌธ ๋‚ด์˜ values ์ฐธ์กฐ ๊ฐ’์€ [1,2,3].values๋กœ ํ•ด์„๋œ๋‹ค.

Example

๋‹ค์Œ with๋ฌธ์€ Math object๊ฐ€ default object์ธ ๊ฒƒ์„ ๋ช…์‹œํ•œ๋‹ค.

with๋ฌธ ๋‹ค์Œ์˜ ๋ช…๋ น๋ฌธ์€ PI property์™€ cos, sin method๋ฅผ ๊ฐ์ฒด ๋ช…์‹œ ์—†์ด ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

with๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•.

JS์˜ ๋น„๋™๊ธฐ์ ์ธ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ํŠน์„ฑ๊ณผ, scope์˜ ์ง€์†์„ฑ์ด ํ•ฉ์ณ์ง„ ๊ฒฐ๊ณผ.

  • ์ฐจ์ด๋ฅผ ์•Œ๊ณ ์‹ถ๋‹ค๋ฉด with ์ค„์„ ์ œ๊ฑฐํ•˜๊ณ , num์„ i๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค.

summary

์ •์˜

  • with๋ฌธ์€ scope chain์„ ํ™•์žฅํ•œ๋‹ค.

  • with๋ฌธ์€ ๊ด„ํ˜ธ์•ˆ์˜ ๊ฐ์ฒด๋ฅผ ํ•ด๋‹น scope chain์— ์ถ”๊ฐ€ํ•œ๋‹ค.

์žฅ์ 

  • ์„ฑ๋Šฅ ํŽ˜๋„ํ‹ฐ ์—†์ด ๊ธด object reference ๋ฐ˜๋ณต์„ ๊ฐ์†Œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋กœ ์ธํ•ด file size๋„ ๊ฐ์†Œํ•œ๋‹ค.

  • ํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ ์›ํ•˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ž„์‹œ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค.

๋‹จ์ 

  • ๋ช…์‹œ๋œ object๋Š” all name lookup์—์„œ ๋จผ์ € ๊ฒ€์ƒ‰๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ๋ช…์‹œ๋œ object์˜ ๋ฉค๋ฒ„๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ์‹๋ณ„์ž๋Š” with๋ฌธ์—์„œ ๋” ์ฒœ์ฒœํžˆ ๋ฐœ๊ฒฌ๋œ๋‹ค.

    • ํผํฌ๋จผ์Šค๊ฐ€ ์ค‘์š”ํ•œ ๊ณณ์—์„œ, with์€ ๋ฌด์กฐ๊ฑด ๋ช…์‹œ๋œ object์˜ ๋ฉค๋ฒ„๋ฅผ ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋ชจํ˜ธ์„ฑ ๋ฌธ์ œ

  • ์—ฌ๊ธฐ์„œ value๋Š” obj์˜ property ํ˜น์€ function formatting argument์ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ์œ„ํ•ด with๋ฌธ ์‚ฌ์šฉ์„ ์ž์ œํ•ด์•ผ ํ•œ๋‹ค.

  • ๋Œ€์‹  ์ž„์‹œ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ํ™œ์šฉํ•˜์ž.

์ฐธ๊ณ 

with ๋ช…๋ น์— ๋Œ€ํ•˜์—ฌarrow-up-right with in MDNarrow-up-right

Last updated

Was this helpful?