Skip to content

Commit ec74407

Browse files
committed
Merge pull request BonsaiDen#155 from miconblog/master
Review Korean Translation
2 parents 2e258af + 764524e commit ec74407

22 files changed

+244
-240
lines changed

doc/ko/array/constructor.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
## `Array` 생성자
1+
## `배열` 생성자
22

3-
`Array` 생성자가 파라미터를 처리하는 방법은 모호하다. 그래서 항상 `[]` 노테이션으로 Array를 만들어야 한다.
3+
배열을 만들때 `배열` 생성자에 파라미터를 넣어 만드는 방법은 헷갈릴수있다. 그래서 항상 각 괄호(`[]`) 노테이션을 이용해 배열을 만들 것을 권한다
44

55
[1, 2, 3]; // Result: [1, 2, 3]
66
new Array(1, 2, 3); // Result: [1, 2, 3]
@@ -9,16 +9,16 @@
99
new Array(3); // Result: []
1010
new Array('3') // Result: ['3']
1111

12-
`Array` 생성자에 인자로 숫자를 넘기면 `length`숫자인 텅 `Array` 하나를 반환된다. 생성자는 **오직** `length` 프로퍼티에 그 숫자를 할당하기만 하고 `Array` 실제로 초기화하지 않는다.
12+
`배열` 생성자에 숫자를 인자로 넣으면숫자 크기 만큼의 `배열`을 반환한다. 즉 배열의 `length`는 그 숫자가 된다. 이때 생성자는 **단지** `length` 프로퍼티에 그 숫자를 할당하기만 하고 `배열` 실제로 초기화 하지도 않는다.
1313

1414
var arr = new Array(3);
1515
arr[1]; // undefined
1616
1 in arr; // false, 이 인덱스는 초기화되지 않음.
1717

18-
Array의 length 프로퍼티에 숫자를 할당해주는 기능이 유용할 때도 있긴 있다. `for loop`을 사용하지 않고 스트링을 더할 때가 그렇다.
18+
`for`문을 사용하지 않고 문자열을 더하는 경우에는 length 프로퍼티에 숫자를 할당해주는 기능이 유용할 때도 있다.
1919

2020
new Array(count + 1).join(stringToRepeat);
2121

2222
### 결론
2323

24-
`Array` 생성자는 가능하면 사용하지 말아야 한다. `[]` 노테이션이 더 알맞다. 더 간략하고 명확하기 때문에 보기도 좋다.
24+
`배열` 생성자는 가능하면 사용하지 말고, 각 괄호 (`[]`) 노테이션이을 사용하자. 후자가 더 간략하고 명확할 뿐만 아니라 보기도 좋다.

doc/ko/array/general.md

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,39 @@
1-
## Array Iteration과 프로퍼티
1+
## 배열 순회와 프로퍼티
22

3-
JavaScript에서는 Array도 객체지만 [`for in`](#object.forinloop)을 사용해서 좋을 게 없다. 실제로 Array에 `for in` 사용하지 말아야 할 근거가 매우 많다.
3+
JavaScript에서는 배열(Array)도 객체(Object)지만 객체 순회(Iterate)를 할 때 [`for in`](#object.forinloop)을 사용해서 좋을 게 없다. 실제로 배열을 탐색할때 `for in` 사용하지 말아야 할 이유가 매우 많다.
44

5-
> **Note:** JavaScript의 Array는 *Associative Array* **아니다**. JavaScript [객체](#object.general)는 key/value만 Mapping할 뿐이다. Associative Array는 순서를 보장하지만, 객체는 보장하지 않는다.
5+
> **Note:** JavaScript의 배열은 *연관 배열(Associative Array)* **아니다**. JavaScript는 오직 key/value를 맵핑한 [객체](#object.general)만 있을 뿐이다. 연관 배열은 순서를 보장해주지만 객체는 순서를 보장하지 않는다.
66
77
`for in`은 프로토타입 체인에 있는 프로퍼티를 모두 훑는(enumerate) 데다가 객체 자신의 프로퍼티만 훑으려면 [`hasOwnProperty`](#object.hasownproperty)를 사용해야 하기 때문에 `for`보다 20배 느리다.
88

9-
### Iteration
9+
### 배열 순회
1010

11-
Array를 Iterate할 때에는 구식인 `for` 사용하는 것이 가장 빠르다.
11+
배열을 순회 할때는 일반적인 `for`문을 사용하는 것이 가장 빠르다.
1212

1313
var list = [1, 2, 3, 4, 5, ...... 100000000];
1414
for(var i = 0, l = list.length; i < l; i++) {
1515
console.log(list[i]);
1616
}
1717

18-
이 예제에서 `l = list.length`Array의 length 값을 캐시해야 한다는 것을 꼭 기억해야 한다.
18+
이 예제에서 `l = list.length`배열의 length 값을 캐시해야 한다는 것을 꼭 기억해야 한다.
1919

20-
매 Iterate마다 Array에 있는 `length` 프로퍼티에 접근하는 것은 좀 부담스럽다. 최신 JavaScript 엔진은 이 일을 알아서 처리해주기도 하지만 코드가 늘 새 엔진에서 실행되도록 보장할 방법이 없다.
20+
매번 반복할때마다 배열에 있는 `length` 프로퍼티에 접근하는 것은 좀 부담스럽다. 최신 JavaScript 엔진은 이 일을 알아서 처리해주기도 하지만 코드가 늘 새 엔진에서 실행되도록 보장할 방법이 없다.
2121

2222
실제로 캐시 하지 않으면 성능이 반으로 줄어든다.
2323

2424
### `length` 프로퍼티
2525

26-
`length` 프로퍼티의 *getter*는 단순히 Array 안에 있는 엘리먼트의 개수를 반환하고 *setter*Array를 할당한 수만큼 잘라 버린다.
26+
`length` 프로퍼티의 *getter*는 단순히 Array 안에 있는 엘리먼트의 개수를 반환하고 *setter*배열을 할당한 수만큼 잘라 버린다.
2727

2828
var foo = [1, 2, 3, 4, 5, 6];
2929
foo.length = 3;
3030
foo; // [1, 2, 3]
3131

3232
foo.length = 6;
33-
foo.push(4);
34-
foo; // [1, 2, 3, undefined, undefined, undefined, 4]
33+
foo; // [1, 2, 3]
3534

36-
현재 크기보다 더 작은 값을 할당하면 Array를 자르고, 현재 크기보다 더 큰 값을 할당하면 늘어난다.
35+
현재 크기보다 더 작은 값을 할당하면 배열을 자르지만, 현재 크기보다 더 큰 값을 할당한다고 해서 배열을 늘리진 않는다.
3736

3837
### 결론
3938

40-
최적의 성능을 위해서는 `for` 사용하고 `length` 프로퍼티 값을 캐시해야 한다. Array에 `for in`을 사용하면 성능도 떨어지고 버그 나기도 쉽다.
39+
최적의 성능을 위해서는 `for`문을 사용하고 `length` 프로퍼티 값을 캐시해야 한다. 배열에 `for in`을 사용하면 성능도 떨어지고 버그 나기도 쉽다.

doc/ko/core/delete.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
## `delete`
1+
## `delete` 연산자
22

3-
간단히 말해서 global 변수, Function, 등은 `DontDelete` 속성이기 때문에 delete하지 못 한다.
3+
간단히 말해서 전역 변수와 전역 함수 그리고 `DontDelete` 속성을 가진 자바스크립트 객체는 삭제할 수 없다.
44

55
### Global 코드와 Function 코드
66

7-
Global이나 Function Scope에 정의한 Fuction이나 변수는 모두 Activation 객체나 Global 객체의 프로퍼티다. 이 프로퍼티는 모두 `DontDelete` 속성을 가진다. Global이나 Function 코드에서 변수나 Function의 정의하면 항상 `DontDelete` 프로퍼티로 만들어진다. 그러니까 delete할 수 없다:
7+
전역이나 함수 스코프에 정의한 함수나 변수는 모두 Activation 객체나 전역 객체의 프로퍼티다. 이 프로퍼티는 모두 `DontDelete` 속성을 가진다. 전역이나 함수 코드에 정의한 변수와 함수는 항상 `DontDelete` 프로퍼티로 만들어지기 때문에 삭제될 수 없다:
88

99
// Global 변수:
1010
var a = 1; // DontDelete가 설정된다.
@@ -21,9 +21,9 @@ Global이나 Function Scope에 정의한 Fuction이나 변수는 모두 Activati
2121
delete f; // false
2222
f; // 1
2323

24-
### Explicit 프로퍼티
24+
### 명시적인(Explicit) 프로퍼티
2525

26-
다음 예제에서 만드는 프로퍼티는 delete할 수 있다. 이런 걸 Explicit 프로퍼티라고 부른다:
26+
다음 예제에서 만드는 프로퍼티는 delete할 수 있다. 이런 걸 명시적인(Explicit) 프로퍼티라고 부른다:
2727

2828
// Explicit 프로퍼티를 만든다:
2929
var obj = {x: 1};
@@ -33,7 +33,7 @@ Global이나 Function Scope에 정의한 Fuction이나 변수는 모두 Activati
3333
obj.x; // undefined
3434
obj.y; // undefined
3535

36-
`obj.x``obj.y``DontDelete` 속성이 아니라서 delete할 수 있다. 그러나 다음과 같은 코드도 잘 동작하기 때문에 헷갈린다:
36+
`obj.x``obj.y``DontDelete` 속성이 아니라서 delete할 수 있다. 하지만 다음과 같은 코드도 잘 동작하기 때문에 헷갈린다:
3737

3838
// IE를 빼고 잘 동작한다:
3939
var GLOBAL_OBJECT = this;
@@ -42,7 +42,7 @@ Global이나 Function Scope에 정의한 Fuction이나 변수는 모두 Activati
4242
delete GLOBAL_OBJECT.a; // true
4343
GLOBAL_OBJECT.a; // undefined
4444

45-
[`this`](#function.this)Global 객체를 가리키는 것을 이용해서 명시적으로 프로퍼티 `a`를 선언하면 삭제할 수 있다. 이것은 꼼수다.
45+
[`this`](#function.this)전역 객체를 가리키는 것을 이용해서 명시적으로 프로퍼티 `a`를 선언하면 삭제할 수 있다. 이것은 꼼수다.
4646

4747
IE (적어도 6-8)는 버그가 있어서 안 된다.
4848

@@ -73,4 +73,4 @@ Host 객체를 delete하면 어떻게 될지 알 수 없다. 표준에는 어떻
7373

7474
### 결론
7575

76-
`delete` 연산자는 엉뚱하게 동작할 때가 잦다. 명시적으로 정의한 일반 객체의 프로퍼티만 delete하는 것이 안전하다.
76+
`delete` 연산자는 엉뚱하게 동작할 때가 많다. 명시적으로 정의한 일반 객체의 프로퍼티만 delete하는 것이 안전하다.

doc/ko/core/eval.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## `eval`을 사용하면 안 될까?
22

3-
`eval` 함수는 스트링으로 된 JavaScript 코드를 Local Scope에서 실행한다.
3+
`eval` 함수는 JavaScript 문자열을 지역 스코프에서 실행한다.
44

55
var foo = 1;
66
function test() {
@@ -11,7 +11,7 @@
1111
test(); // 3
1212
foo; // 1
1313

14-
`eval` `eval`이라는 이름으로 **직접** 직행할 때에만 Local Scope에서 실행된다.
14+
`eval`함수는 `eval`이라는 이름으로 **직접** 실행할 때에만 지역 스코프에서 실행된다. 그리고 `eval`이라는 이름에 걸맞게 악명또한 높다.
1515

1616
var foo = 1;
1717
function test() {
@@ -23,15 +23,15 @@
2323
test(); // 2
2424
foo; // 3
2525

26-
어쨌든 `eval`은 사용하지 말아야 한다. eval을 사용하는 경우의 99.9%는 사실 eval이 필요 없다.
26+
어쨌든 `eval`은 사용하지 말아야 한다. eval을 사용하는 99.9%는 사실 eval 없이도 만들수있다.
2727

2828
### 가짜 `eval`
2929

3030
[`setTimeout``setInterval`](#other.timeouts)은 첫 번째 인자로 스트링을 입력받을 수 있다. 이 경우에는 `eval`을 직접 호출하는 것이 아니라서 항상 Global Scope에서 실행된다.
3131

3232
### 보안 이슈
3333

34-
`eval`보안 문제도 있다. 단순히 **모든** 코드를 실행하기 때문에 신뢰하지 못하는 코드가 **절대로** 포함되지 않도록 주의해야 한다.
34+
`eval`어떤 코드라도 **무조건** 실행하기 때문에 보안 문제도 있다. 따라서 신뢰하지 못하거나 모르는 코드가 포함되어 있을 경우 **절대로** 사용해서는 안된다.
3535

3636
### 결론
3737

doc/ko/core/semicolon.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
## 쎄미콜론을 자동으로 삽입해준다.
1+
## 자동으로 삽입되는 쎄미콜론
22

3-
JavaScript는 C와 문법이 비슷하지만, 꼭 코드에 쎄미콜론을 사용하도록 강제하지 않는다. 그래서 생략할 수 있다.
3+
JavaScript는 C와 문법이 비슷하지만, 꼭 코드에 쎄미콜론을 사용하도록 강제하지는 않는다. 그래서 생략할 수 있다.
44

55
사실 JavaScript는 쎄미콜론이 꼭 있어야 하고 없으면 이해하지 못한다. 그래서 JavaScript 파서는 쎄미콜론이 없으면 **자동으로** 쎄미콜론을 추가한다.
66

@@ -81,18 +81,18 @@ JavaScript는 C와 문법이 비슷하지만, 꼭 코드에 쎄미콜론을 사
8181
8282
파서는 완전히 다른 코드로 만들어 버린다. 이것은 **오류**다.
8383

84-
### Parenthesis
84+
### 괄호 해석
8585

86-
쎄미콜론 없이 괄호가 붙어 있으면 파서는 쎄미콜론을 넣지 않는다.
86+
파서는 괄호에는 쎄미콜론을 넣지 않는다.
8787

8888
log('testing!')
8989
(options.list || []).forEach(function(i) {})
9090

91-
파서는 다음과 같이 코드를 바꾼다.
91+
그래서 다음과 같이 한줄로 코드를 바꾼다.
9292

9393
log('testing!')(options.list || []).forEach(function(i) {})
9494

95-
`log` 함수가 함수를 반환할 가능성은 거의 없다. 아마도 `undefined is not a function`이라는 `TypeError`발생할 거다.
95+
이렇게 한줄로 바뀌면 `log` 함수가 함수를 반환할 가능성이 거의 없으므로 `undefined is not a function`이라는 `TypeError`발생한다.
9696

9797
### 결론
9898

doc/ko/core/undefined.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## `undefined``null`
22

3-
JavaScript는 `nothing`을 두 가지로 표현할 수 있고 그중 `undefined`가 더 유용하다.
3+
JavaScript는 `nothing`표현할때 `null``undefined` 두 가지로 표현할 수 있고 그중 `undefined`가 더 유용하다.
44

55
### `undefined`도 변수
66

@@ -13,8 +13,8 @@ JavaScript는 `nothing`을 두 가지로 표현할 수 있고 그중 `undefined`
1313
`undefined` 값이 반환될 때:
1414

1515
- global 변수 `undefined`에 접근할 때.
16-
- 아직 초기화하지 않은 변수
17-
- `return` 구문이 없는 함수는 `undefined`를 반환함.
16+
- 선언은 했지만 아직 초기화하지 않은 변수에 접근할 때.
17+
- `return` 구문이 없는 함수는 암묵적으로 `undefined`를 반환함.
1818
- `return` 구문으로 아무것도 반환하지 않을 때.
1919
- 없는 프로퍼티를 찾을 때.
2020
- 함수 인자가 생략될 때.
@@ -29,7 +29,7 @@ global 변수 `undefined`는 `undefined`라는 객체를 가리키는 것뿐이
2929

3030
그래서 `undefined`와 비교하려면 먼저 `undefined`의 값을 찾아와야 한다.
3131

32-
`undefined` 변수가 바뀔 때를 대비해서 `undefined`라는 변수를 인자로 받는 [anonymous wrapper](#function.scopes)로 감싸고 아무런 인자를 넘기지 않는 꼼수를 사용한다.
32+
`undefined` 변수가 바뀔 때를 대비해서 `undefined`라는 변수를 인자로 받는 [anonymous wrapper](#function.scopes)로 감싸고 인자를 넘기지 않는 꼼수를 사용한다.
3333

3434
var undefined = 123;
3535
(function(something, foo, undefined) {

doc/ko/function/arguments.md

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
## `arguments` 객체
22

3-
JavaScript의 모든 Function Scope에는 `arguments`라는 특별한 변수가 있다. 이 변수는 Function에 넘겨진 모든 인자에 대한 정보가 담겨 있다.
3+
JavaScript의 모든 함수 스코프에는 `arguments`라는 특별한 변수가 있다. 이 변수는 함수에 넘겨진 모든 인자에 대한 정보가 담겨 있다.
44

55
> **Note:** `arguments` 변수는 Function 안에서 다시 정의할 수 없다. `var` 구문이나 파라미터에 `arguments`라는 이름으로 변수를 정의해도 변수가 재정의되지 않는다.
66
7-
`length` 프로퍼티도 있는 데다가 여러모로 Array와 비슷하게 생겼지만 Array.prototype을 상속받지 않았다. `arguments` 객체는 `Array`가 아니다.
7+
`arguments` 객체는 `Array`가 아니다. 물론 `length` 프로퍼티도 있고 여러모로 Array와 비슷하게 생겼지만 Array.prototype을 상속받지는 않았다.
88

9-
그래서 `arguments`에는 `push`, `pop`, `slice` 같은 표준 메소드가 없다. `for`로 하는 Iteration은 원래 잘되지만 `Array`의 메소드를 이용하려면 `arguments`를 Array로 변환해야 한다.
9+
그래서 `arguments`에는 `push`, `pop`, `slice` 같은 표준 메소드가 없다. 일반 `for`문을 이용해 순회는 할수 있지만, `Array`의 메소드를 이용하려면 `arguments`를 Array로 변환해야 한다.
1010

1111
### Array로 변환하기
1212

@@ -18,7 +18,7 @@ JavaScript의 모든 Function Scope에는 `arguments`라는 특별한 변수가
1818

1919
### arguemnts 객체 넘기기
2020

21-
어떤 Function에서 다른 Function로 arguments 객체를 넘길 때에는 다음과 같이 하는 것이 좋다.
21+
어떤 함수에서 다른 함수로 arguments 객체를 넘길 때에는 다음과 같은 방법을 권한다. (역주: foo 함수는 bar 함수 한번 랩핑한 함수다. )
2222

2323
function foo() {
2424
bar.apply(null, arguments);
@@ -27,25 +27,25 @@ JavaScript의 모든 Function Scope에는 `arguments`라는 특별한 변수가
2727
// 내곡동에 땅이라도 산다.
2828
}
2929

30-
`call``apply`를 함께 사용하여 unbound wrapper도 쉽게 만들 수 있다.
30+
또 다른 방법으로는 함수를 랩핑하지 않고, 풀어서 `call``apply`를 함께 사용하는 방법이 있다. (역주: 프로토타입에 있는 method를 호출하기 전에 Foo 객체 안에 있는 method로 한번더 필터링하는 효과가 있다. )
3131

3232
function Foo() {}
3333

3434
Foo.prototype.method = function(a, b, c) {
3535
console.log(this, a, b, c);
3636
};
3737

38-
// "method"unbound 버전
38+
// "method"를 풀어 쓴(unbound) 버전
3939
// 이 Function의 인자: this, arg1, arg2...argN
4040
Foo.method = function() {
4141

4242
// 결과: Foo.prototype.method.call(this, arg1, arg2... argN)
4343
Function.call.apply(Foo.prototype.method, arguments);
4444
};
4545

46-
### 파라미터와 arguments 객체 인덱스
46+
### 일반 파라미터와 arguments 객체의 인덱스
4747

48-
파라미터와 `arguments` 객체의 프로퍼티는 모두 *getter**setter*를 가진다.
48+
일반 파라미터와 `arguments` 객체의 프로퍼티는 모두 *getter**setter*를 가진다.
4949

5050
그래서 파라미터나 `arguments` 객체의 프로퍼티의 값을 바꾸면 둘 다 바뀐다.
5151

@@ -62,9 +62,9 @@ JavaScript의 모든 Function Scope에는 `arguments`라는 특별한 변수가
6262
}
6363
foo(1, 2, 3);
6464

65-
### 성능에 대한 진실과 오해.
65+
### 성능에 대한 오해와 진실.
6666

67-
`arguments` 객체는 항상 만들어 지지만 예외도 있다. `arguments`라는 이름의 변수를 Function 안에 정의하거나 그 이름으로 파라미터를 만들면 `arguemnts` 객체는 만들어지지 않는다. 그렇지만, 이럴때는 어차피 안쓰겠다는 의미니까 상관 없다.
67+
`arguments` 객체는 항상 만들어지지만 두가지 예외사항이 있다. `arguments`라는 이름으로 변수를 함수 안에 정의하거나 arguments 객체로 넘겨받는 인자중 하나라도 정식 인자로 받아서 사용하면 `arguemnts` 객체는 만들어지지 않는다. 하지만 뭐 이런 경우들은 어차피 arguments 객체를 안쓰겠다는 의미니까 상관 없다.
6868

6969
그리고 *getter**setter*는 항상 생성되기 때문에 getter/setter를 사용하는 것은 성능에 별 영향을 끼치지 않는다. 예제처럼 단순한 코드가 아니라 `arguments` 객체를 다방면으로 활용하는 실제 코드에서도 마찬가지다.
7070

@@ -73,8 +73,8 @@ JavaScript의 모든 Function Scope에는 `arguments`라는 특별한 변수가
7373
그러나 예외도 있다. 최신 JavaScript 엔진에서 `arguments.callee`를 사용하면 성능이 확 떨어진다.
7474

7575
function foo() {
76-
arguments.callee; // 이 Function를 가리킨다.
77-
arguments.callee.caller; // 이 Function를 호출한 Function를 가리킨다.
76+
arguments.callee; // 이 함수를 가리킨다.
77+
arguments.callee.caller; // 이 함수를 호출한 부모함수를 가리킨다.
7878
}
7979

8080
function bigLoop() {
@@ -83,9 +83,10 @@ JavaScript의 모든 Function Scope에는 `arguments`라는 특별한 변수가
8383
}
8484
}
8585

86-
이 코드에서 Callee와 Caller를 알아야 하기 때문에 `foo`는 더는 [인라인][1]하지 않는다. 이렇게 쓰면 인라인이 주는 성능상 장점을 포기해야 하는데다가 Function이 호출되는 상황(calling context)에 의존하게 돼 버려서 Encapsulation도 해친다.
86+
위 코드에서 'foo' 함수는 자기 자신과 자신을 호출한 함수를 알아야 하기 때문에 더이상 [인라인][1]되지 않는다. 이렇게 쓰면 인라인이 주는 성능상 장점을 포기해야 하는데다가 이 함수가 호출되는 상황(calling context)에 의존하게 돼 버려서 캡슐화(Encapsulation)도 해친다.
87+
(역주: 보통 코드가 컴파일 될때 코드를 인라인 시키면서 최적화 하는데, 위와 같이 arguments.callee나 caller를 사용하게 되면 런타임시에 해당 함수가 결정되므로 인라인 최적화를 할수가 없다.)
8788

88-
`arguments.callee` 프로퍼티들은 **절대** 사용하지 말아야 한다.
89+
`arguments.callee`arguments.callee의 프로퍼티들은 **절대** 사용하지 말자!.
8990

9091
> **ES5 Note:** strict 모드에서 `arguments.callee`는 deprecated됐기 때문에 사용하면 `TypeError`가 난다.
9192

0 commit comments

Comments
 (0)