# with
# Syntax
with (expression)
statement
1
2
2
# expression
statement
를 평가할 때, 범위 체인에, expression
을 추가
- statement 가 expression 속성의 속성인가?
YES
expression 에 바인딩 된다.NO
ReferenceError
- 표현식을 중괄호로 감싸는 것은 필수
# statement
- 모든 구문
- 여러개의 명령문을 실행 : 블록명령문 ({...}) 사용 - 명령문을 그룹화
# Not recommended
- 혼란스러운 버그 야기
- 호환성 이슈
- ES5 엄격모드에서 금지
# 예시
특정 조건에서 작성해야 할 코드의 양을 줄임
with(document) { //document가 속성 앞에 붙게 됩니다.
write("with 명령문을 사용하면<br>");
write("반복 사용할 특정객체를<br>");
write("여러번 사용하지 않고도<br>");
write("편리하게 사용할 수 있습니다");
}
// BEFORE
x = Math.cos(3 * Math.PI) + Math.sin(Math.LN10)
y = Math.tan(14 * Math.E)
// AFTER
with (Math){
x = cos(3 * PI) + sin (LN10)
y = tan(14 * E)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 장점
성능 저하없이
긴객체 참조를 반복
해야할 필요를줄여
파일 크기를 감소
- with 에 필요한
스코프 체인 변경 연산
은비용이 없다
. 반복되는 객체 참조
를 하는 인터프리터가해소
된다.- 임시변수를 사용하는 방법으로 with 를 대체할 수 있다.
# 단점
- statement 가 expression 의 속성이 아닌경우, with 를 안썼을 때 보다 시간이 더 소요된다.
- 성능이 중요한 경우 with statements 에는 expression 의 멤버에 접근하는 코드만 써야한다.
# 모호성
사람이나 js 컴파일러가 인식하는 console.log(x)
x 의 스코프 체인의 혼란이 올 수 있다. (....?)
function f(x, o) {
with (o) {
console.log(x);
}
}
1
2
3
4
5
2
3
4
5
f('a', {}); // 'a'
1
f('a', { x: 'A'}); // 'A'
1
f([1,2,3], obj)
1