recursal/MDN huggingface dataset:
Symbol.for()
============

**`Symbol.for(key)`** 메서드는 주어진 키를 사용해 런타임 범위의 심볼 레지스트리에서 존재하는 심볼을 찾고,
 존재할 경우 이를 반환합니다. 존재하지 않는 경우에는 해당 키를 사용해 전역 심볼 레지스트리에 새로운 심볼을 생성합니다.

시도해보기
-----

구문
--


```js
Symbol.for(key)
```

### 매개변수

`key`

문자열, 필수. 심볼에 대한 키(심볼을 설명하기 위해서도 사용됨).

### 반환 값

주어진 키를 갖는 존재하는 심볼. 존재하지 않을 경우 새로운 심볼이 생성되고 반환됨.

설명
--

`Symbol()`과 대조적으로, `Symbol.for()` 함수는 전역 심볼 레지스트리 목록에서 사용 가능한 심볼을 생성합니다.
 `Symbol.for()`는 호출할 때마다 새로운 심볼을 생성하지는 않으며 레지스트리에서 주어진 `key`를 갖는 심볼이
 이미 존재하는지를 먼저 확인합니다. 존재하는 경우 해당하는 심볼이 반환됩니다.
 주어진 키를 갖는 심볼이 존재하지 않는 경우, `Symbol.for()`는 새로운 전역 심볼을 생성합니다.

예제
--

### Symbol.for() 사용하기


```js
Symbol.for("foo"); // 새로운 전역 심볼을 생성
Symbol.for("foo"); // 이미 생성된 심볼을 반환

// 동일한 전역 심볼이지만 지역적으로는 그렇지 않음
Symbol.for("bar") === Symbol.for("bar"); // true
Symbol("bar") === Symbol("bar"); // false

// 키는 설명으로 사용되기도 함
var sym = Symbol.for("mario");
sym.toString(); // "Symbol(mario)"
```


전역 심볼 키와 다른 (라이브러리 코드) 전역 심볼의 이름 충돌을 피하려면, 심볼에 접두어를 붙이는 것이 좋습니다.


```js
Symbol.for("mdn.foo");
Symbol.for("mdn.bar");
```

명세
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-symbol.for |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* `Symbol.keyFor()`
Symbol.split
============

**`Symbol.split`** 정적 데이터 속성은 잘 알려진 심볼 `@@split`을 나타냅니다. `String.prototype.split()` 메서드는 현재 객체와 일치하는 인덱스에서 문자열을 분할하는 메서드의 첫 번째 인수에서 이 심볼을 찾습니다.

보다 상세한 내용은 `RegExp.prototype[@@split]()` (en-US) 및 `String.prototype.split()`를 참조하시기 바랍니다.

시도해보기
-----

값
-

잘 알려진 심볼 `@@split`.

| Property attributes of `Symbol.split` |
| --- |
| Writable | 불가능 |
| Enumerable | 불가능 |
| Configurable | 불가능 |

예제
--

### 사용자 정의 역분할


```js
class ReverseSplit {
  [Symbol.split](string) {
    const array = string.split(" ");
    return array.reverse();
  }
}

console.log("Another one bites the dust".split(new ReverseSplit()));
// [ "dust", "the", "bites", "one", "Another" ]
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-symbol.split |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* Polyfill of `Symbol.split` in `core-js`
* `Symbol.match` (en-US)
* `Symbol.matchAll` (en-US)
* `Symbol.replace` (en-US)
* `Symbol.search`
* `String.prototype.split()`
* `RegExp.prototype[@@split]()` (en-US)
Symbol.isConcatSpreadable
=========================

**`Symbol.isConcatSpreadable`** 정적 데이터 속성은 잘 알려진 심볼 `@@isConcatSpreadable`을 나타냅니다.
 `Array.prototype.concat()` 메서드는 연결된 각 객체에서 이 심볼을 찾아 유사 배열과 객체로 취급하고
 해당 배열 요소로 평탄화해야 하는지 여부를 결정합니다.

시도해보기
-----

값
-

잘 알려진 심볼 `@@isConcatSpreadable`.

| Property attributes of `Symbol.isConcatSpreadable` |
| --- |
| Writable | 불가능 |
| Enumerable | 불가능 |
| Configurable | 불가능 |

설명
--

`@@isConcatSpreadable` 심볼(`Symbol.isConcatSpreadable`)은 자체 또는 상속된 속성으로
 정의할 수 있으며, 그 값은 불리언입니다. 아래와 같이 배열 및 배열 유사 객체에 대한 동작을 제어할 수 있습니다.

* 배열 객체의 경우 기본 동작은 요소를 펼치는(평평하게 하는) 것입니다.
 `Symbol.isConcatSpreadable`은 이러한 경우 평탄화를 피할 수 있습니다.
* 배열과 유사한 객체의 경우 기본 동작은 펼치거나 평평하게 하지 않는 것입니다.
 `Symbol.isConcatSpreadable`은 이러한 경우 평탄화를 강제할 수 있습니다.
예제
--

### 배열

기본적으로 `Array.prototype.concat()`는 여러 배열을 하나의 결과로 펼칩니다(평평하게 만듭니다).


```js
const alpha = ["a", "b", "c"];
const numeric = [1, 2, 3];

const alphaNumeric = alpha.concat(numeric);

console.log(alphaNumeric); // 결과: ['a', 'b', 'c', 1, 2, 3]
```


`Symbol.isConcatSpreadable`을 `false`로 설정하면 기본 동작을 비활성화할 수 있습니다.


```js
const alpha = ["a", "b", "c"];
const numeric = [1, 2, 3];

numeric[Symbol.isConcatSpreadable] = false;
const alphaNumeric = alpha.concat(numeric);

console.log(alphaNumeric); // Result: ['a', 'b', 'c', [1, 2, 3] ]
```

### 유사 배열 객체

 유사 배열 객체에서는 기본 동작이 평탄화시키지 않는 것입니다.
 배열을 평탄화시키고 싶다면 `Symbol.isConcatSpreadable`을 `true`로 설정할 필요가 있습니다.


```js
const x = [1, 2, 3];

const fakeArray = {
  [Symbol.isConcatSpreadable]: true,
  length: 2,
  0: "hello",
  1: "world",
};

x.concat(fakeArray); // [1, 2, 3, "hello", "world"]
```


**참고:** `length` 속성은 추가할 객체 속성의 수를 제어하는 데 사용됩니다.
 위의 예제에서 `length:2`는 2개의 속성이 추가되었다는 것을 가리킵니다.


명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-symbol.isconcatspreadable |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* Polyfill of `Symbol.isConcatSpreadable` in `core-js`
* `Array.prototype.concat()`
Symbol.iterator
===============

잘 알려진 **`Symbol.iterator`** 심볼은 객체에 대응하는 기본 이터레이터를 지정합니다. `for...of`와 같이 사용됩니다.

시도해보기
-----

| Property attributes of `Symbol.iterator` |
| --- |
| Writable | 불가능 |
| Enumerable | 불가능 |
| Configurable | 불가능 |

설명
--

(`for..of` 루프의 시작부분과 같이) 객체가 반환될 필요가 있을때는 언제든지`@@iterator` 메서드는 인수 없이도 호출 할 수 있습니다. 반환된 **iterator**는 반복할 값을 취득하기 위해 사용됩니다.

`Object`와 같이 반복동작을 내장하고 있는 형태도 있지만 그렇지 않은 경우도 있습니다. `@@iterator` 메서드를 가지고 있는 내장형 타입은 아래와 같습니다.

* `Array.prototype[@@iterator]()`
* `TypedArray.prototype[@@iterator]()`
* `String.prototype[@@iterator]()` (en-US)
* `Map.prototype[@@iterator]()`
* `Set.prototype[@@iterator]()`

상세한 내용은 반복처리 프로토콜도 확인 해 주시기 바랍니다.

예제
--

### 유저 정의 이터레이터

앞에서 기술한 바와 같이 독자적으로 이터레이터를 만드는 것이 가능합니다.


```js
var myIterable = {};
myIterable[Symbol.iterator] = function\* () {
  yield 1;
  yield 2;
  yield 3;
};
[...myIterable]; // [1, 2, 3]
```

### 비정형 이터레이터

iterable의 `@@iterator` 메서드가 이터레이터 객체를 반환하지 않는 경우 비정형 이터레이터입니다. 이와 같이 사용하는 경우 실행시 예외 혹은 예상치 못한 버그를 발생할 가능성이 있습니다.


```js
var nonWellFormedIterable = {}
nonWellFormedIterable[Symbol.iterator] = () => 1
[...nonWellFormedIterable] // TypeError: [] is not a function
```

명세
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-symbol.iterator |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

관련 정보
-----

* 반복처리 프로토콜
* `Array.prototype[@@iterator]()`
* `TypedArray.prototype[@@iterator]()`
* `String.prototype[@@iterator]()` (en-US)
* `Map.prototype[@@iterator]()`
* `Set.prototype[@@iterator]()`
Symbol.keyFor()
===============

**`Symbol.keyFor()`** 정적 메서드는 주어진 심볼에 해당하는 공유 심볼의 키를 전역 심볼 레지스트리에서 검색합니다.

시도해보기
-----

구문
--


```js
Symbol.keyFor(sym)
```

### 매개변수

`sym`

Symbol, 필수 값. 키를 찾기 위한 Symbol

### 반환 값

글로벌 레지스트리에 있는 경우
 지정된 심볼의 키를 나타내는 문자열이고, 그렇지 않으면 `undefined`입니다.

예제
--

### keyFor() 사용하기


```js
const globalSym = Symbol.for("foo"); // 새로운 전역 심볼 생성
Symbol.keyFor(globalSym); // "foo"

const localSym = Symbol();
Symbol.keyFor(localSym); // undefined

// 잘 알려진 심볼은 글로벌 심볼 레지스트리에 등록되지 않은 심볼입니다.
Symbol.keyFor(Symbol.iterator); // undefined
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-symbol.keyfor |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* `Symbol.for()`
Symbol.prototype[@@toPrimitive]
===============================

**`[@@toPrimitive]()`** 메서드는 Symbol 객체를 원시 값으로 변환합니다.

구문
--


```js
Symbol()[Symbol.toPrimitive](hint)
```

### 반환 값

명시된 `Symbol` 객체의 원시 값입니다.

설명
--

`Symbol`의 `[@@toPrimitive]()` 메서드는 Symbol 객체의 원시 값을
 Symbol 데이터 유형으로 반환합니다. `hint` 인자는 사용되지 않습니다.

 JavaScript는 객체를 원시 값으로 변환하기 위해 `[@@toPrimitive]()` 메서드를 호출합니다. 여러분은
 `[@@toPrimitive]()` 메서드를 직접 호출할 필요가 거의 없습니다. 원시 값이 예상되는 객체를 만나면 JavaScript가
 자동으로 호출합니다.

예제
--

### @@toPrimitive 사용하기


```js
const sym = Symbol("example");
sym === sym[Symbol.toPrimitive](); // true
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-symbol.prototype-@@toprimitive |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* `Symbol.toPrimitive`
Symbol.hasInstance
==================

**`Symbol.hasInstance`** 정적 데이터 속성은 잘 알려진 심볼 `@@hasInstance`를 나타냅니다.
 `instanceof` 연산자는 생성자 객체가 객체를 인스턴스로 인식하는지 여부를 확인하기 위해
 사용하는 메서드의 오른쪽 피연산자에서 이 심볼을 찾습니다.

시도해보기
-----

값
-

잘 알려진 심볼 `@@hasInstance`.

| Property attributes of `Symbol.hasInstance` |
| --- |
| Writable | 불가능 |
| Enumerable | 불가능 |
| Configurable | 불가능 |

설명
--

`instanceof` 연산자는 다음 알고리즘을 사용하여 `object instanceof constructor`의 반환 값을 계산합니다.

1. `constructor`에 `@@hasInstance` 메서드가 있는 경우, 첫 번째 인수로 `object`를 사용하여 호출하고 불리언으로 강제 변환된 결과를 반환합니다.
 `constructor`가 객체가 아니거나 `constructor[@@hasInstance]`가 `null`, `undefined`, 함수 중 하나가 아닌 경우 `TypeError`가 발생합니다.
2. 그렇지 않으면, `constructor`에 `@@hasInstance` 메서드가 없는 경우(`constructor[@@hasInstance]`가 `null` 또는 `undefined`),
 `Function.prototype[@@hasInstance]` (en-US)와 동일한 알고리즘을 사용하여 결과를 결정합니다.
 `constructor`가 함수가 아닌 경우 `TypeError`가 발생합니다.

모든 함수는 기본적으로 `Function.prototype`을 상속하기 때문에, 대부분의 경우 `Function.prototype[@@hasInstance]` (en-US) 메서드는 오른쪽이 함수인 경우 `instanceof`의 동작을 지정합니다.

예제
--

### 사용자 지정 instanceof 동작

예를 들어 다음과 같이 사용자 정의 `instanceof` 동작을 구현할 수 있습니다.


```js
class MyArray {
  static [Symbol.hasInstance](instance) {
    return Array.isArray(instance);
  }
}
console.log([] instanceof MyArray); // true
```



```js
function MyArray() {}
Object.defineProperty(MyArray, Symbol.hasInstance, {
  value(instance) {
    return Array.isArray(instance);
  },
});
console.log([] instanceof MyArray); // true
```

### 객체의 인스턴스 검사하기

`instanceof` 키워드를 사용하여 객체가 클래스의 인스턴스 여부를 확인할 수 있는 것과 같은 방법으로
 `Symbol.hasInstance`를 사용하여 동일한 검사를 수행할 수 있습니다.


```js
class Animal {
  constructor() {}
}

const cat = new Animal();

console.log(Animal[Symbol.hasInstance](cat)); // true
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-symbol.hasinstance |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* `instanceof`
* `Function.prototype[@@hasInstance]()` (en-US)
Symbol.search
=============

 잘 알려진 심볼 **`Symbol.search`** 는 정규식과 일치하는 문자열 내의 인덱스를 반환하는 메서드를 명시합니다.
 이 함수는 `String.prototype.search()` (en-US) 메서드가 호출됩니다.

 자세한 내용은 `RegExp.prototype[@@search]()` (en-US) 및
 `String.prototype.search()` (en-US)을 참조하세요.

시도해보기
-----

값
-

잘 알려진 심볼 `@@search`.

| Property attributes of `Symbol.search` |
| --- |
| Writable | 불가능 |
| Enumerable | 불가능 |
| Configurable | 불가능 |

예제
--

### 고유의 문자열 검색


```js
class caseInsensitiveSearch {
  constructor(value) {
    this.value = value.toLowerCase();
  }
  [Symbol.search](string) {
    return string.toLowerCase().indexOf(this.value);
  }
}
console.log("foobar".search(new caseInsensitiveSearch("BaR"))); // 3
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-symbol.search |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* Polyfill of `Symbol.search` in `core-js`
* `Symbol.match` (en-US)
* `Symbol.replace` (en-US)
* `Symbol.split`
* `RegExp.prototype[@@search]()` (en-US)
Symbol.prototype.toString()
===========================

**`toString()`** 메서드는 지정된 심볼 값을 나타내는 문자열을 반환합니다.

시도해보기
-----

구문
--


```js
toString()
```

### 반환 값

지정된 심볼 값을 나타내는 문자열.

설명
--

`Symbol` 객체는 `Object`의 `toString` 메서드를 재정의하며,
 `Object.prototype.toString()`을 상속하지 않습니다.
 `Symbol` 값의 경우 `toString` 메서드는 `"Symbol(description)"` 형식의 설명 문자열을 반환하며,
 여기서 `description`은 심볼의 설명입니다.

`toString()` 메서드는 `this` 값이 `Symbol` 원시 값 또는 래퍼 객체여야 합니다. 이 외의 `this` 값에 대해서는 심볼 값으로 강제 변환하지 않고 `TypeError`를 던집니다.

`Symbol`에는 `[@@toPrimitive]()` 메서드가 있기 때문에 `Symbol` 객체를 문자열로 강제 변환할 때 이 메서드가 항상 `toString()`보다 우선합니다.
 그러나 `Symbol.prototype[@@toPrimitive]()`는 심볼 원시 값을 반환하고 심볼 원시 값은 문자열로 암시적으로 변환될 때 `TypeError`가 발생하기 때문에 언어에서 `toString()` 메서드는 절대 암시적으로 호출되지 않습니다.
 심볼을 문자열화하려면 해당 심볼의 `toString()` 메서드를 명시적으로 호출하거나 `String()` (en-US) 함수를 사용해야 합니다.

예제
--

### toString() 사용하기


```js
Symbol("desc").toString(); // "Symbol(desc)"

// 잘 알려진 심볼
Symbol.iterator.toString(); // "Symbol(Symbol.iterator)"

// 글로벌 심볼
Symbol.for("foo").toString(); // "Symbol(foo)"
```

### 암시적 toString() 호출

JavaScript가 심볼 래퍼 객체에서 `[@@toPrimitive]()` 대신 `toString()`을 암시적으로 호출하도록 하는 유일한 방법은 `@@toPrimitive` 메서드를 먼저 삭제 (en-US) 처리하는 방법 뿐 입니다.

> 
> **주의:** 실제로 이 작업을 수행하지 마세요. 정확히 무엇을 하고 있는지 알지 못하면 기본 제공 객체를 변경하지 마세요.
> 
> 
> 


```js
delete Symbol.prototype[Symbol.toPrimitive];
console.log(`${Object(Symbol("foo"))}`); // "Symbol(foo)"
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-symbol.prototype.tostring |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* `Object.prototype.toString()`
Int32Array() constructor
========================

**`Int32Array`** 형식화 배열(TypedArray) 생성자는 플랫폼의 바이트 순서를 따르는 2의 보수 32비트의 부호있는 정수
 배열을 생성합니다. 바이트 순서를 제어해야 하는 경우 대신 `DataView`를 사용합니다. 배열의 내용은 0으로
 초기화됩니다. 배열이 생성되면 객체의 메서드를 사용하거나 표준 배열 인덱스 구문(즉, 대괄호 표기법 사용)을 사용하여 배열의 요소를
 참조할 수있습니다.

구문
--


```js
new Int32Array()
new Int32Array(length)
new Int32Array(typedArray)
new Int32Array(object)

new Int32Array(buffer)
new Int32Array(buffer, byteOffset)
new Int32Array(buffer, byteOffset, length)
```


> 
> **Note:** `Int32Array()`는 오직 `new`로만 생성할 수 있습니다. `new` 없이 호출을 시도하면 `TypeError` 예외가 발생합니다.
> 
> 
> 

### 매개변수

`TypedArray`를 참고하세요.

### 예외

`TypedArray`를 참고하세요.

예제
--

### Int32Array을 생성하기 위한 각기 다른 여러 방법


```js
// 길이로부터 생성
const int32 = new Int32Array(2);
int32[0] = 42;
console.log(int32[0]); // 42
console.log(int32.length); // 2
console.log(int32.BYTES\_PER\_ELEMENT); // 4

// 배열로부터
const x = new Int32Array([21, 31]);
console.log(x[1]); // 31

// 다른 TypedArray로부터
const y = new Int32Array(x);
console.log(y[0]); // 21

// ArrayBuffer로부터
const buffer = new ArrayBuffer(32);
const z = new Int32Array(buffer, 4, 4);
console.log(z.byteOffset); // 4

// 순회로부터
const iterable = (function\* () {
  yield\* [1, 2, 3];
})();
const int32FromIterable = new Int32Array(iterable);
console.log(int32FromIterable);
// Int32Array [1, 2, 3]
```

명세
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-typedarray-constructors |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* `core-js`에서 `Int32Array` 폴리필
* JavaScript 형식화 배열
* `ArrayBuffer`
* `DataView`
JSON.parse()
============

**`JSON.parse()`** 메서드는 JSON 문자열의 구문을 분석하고, 그 결과에서 JavaScript 값이나 객체를 생성합니다. 선택적으로, `reviver` 함수를 인수로 전달할 경우, 결과를 반환하기 전에 변형할 수 있습니다.

시도해보기
-----

구문
--


```js
    JSON.parse(text[, reviver])
```

### 매개변수

`text`

JSON으로 변환할 문자열. JSON 구문은 `JSON` 객체의 설명을 참고하세요.

`reviver` Optional

함수라면, 변환 결과를 반환하기 전에 이 인수에 전달해 변형함.

### 반환 값

주어진 JSON 문자열에 대응하는 `Object`.

### 예외

변환할 문자열이 유효한 JSON이 아닐 경우 `SyntaxError`.

예제
--

### `JSON.parse()` 사용하기


```js
JSON.parse("{}"); // {}
JSON.parse("true"); // true
JSON.parse('"foo"'); // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse("null"); // null
```

### `reviver` 매개변수 사용하기

`reviver`가 주어지면 분석한 값을 반환하기 전에 변환합니다. 구체적으로는, 분석한 값과 그 모든 속성(가장 깊게 중첩된 속성부터 시작해 제일 바깥의 원래 값까지)을 각각 `reviver`에 전달합니다. `reviver`의 `this` 문맥은 분석한 값으로 설정되고, 속성 명(문자열)과 값을 인자로 전달받습니다. `reviver`가 `undefined`를 반환하거나 반환하지 않는다면, 예컨대 함수가 중간에 실패한다면 그 속성은 최종 결과에서 제외됩니다. 그 외에는 반환 값으로 속성의 값을 재설정합니다.

만약 `reviver`가 일부 값만 변환하고 나머지는 건드리지 않는다면, 나머지 값을 그대로 반환하는걸 잊지 마세요. 그렇지 않으면 변환한 값 외에는 결과에서 모두 제외됩니다.


```js
JSON.parse(
  '{"p": 5}',
  (key, value) =>
    typeof value === "number"
      ? value \* 2 // 숫자라면 2배
      : value, // 나머진 그대로
);

// { p: 10 }

JSON.parse('{"1": 1, "2": 2, "3": {"4": 4, "5": {"6": 6}}}', (key, value) => {
  console.log(key); // 현재 속성명 출력, 마지막은 빈 문자열("")
  return value; // 변환하지 않고 그대로 반환
});

// 1
// 2
// 4
// 6
// 5
// 3
// ""
```

### 후행 쉼표 사용 불가


```js
// 둘 다 SyntaxError
JSON.parse("[1, 2, 3, 4, ]");
JSON.parse('{"foo" : 1, }');
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-json.parse |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* `JSON.stringify()`
함수 선언
=====

**함수 선언**(**function declaration**)은 지정된 매개변수(parameter)를 갖는 함수를 정의합니다.

`Function` 생성자나 `함수 표현식(function expression)`을 사용해서 정의할 수도 있습니다.

시도해보기
-----

구문
--


```js
    function name([param[, param,[..., param]]]) { [statements] }
```


`name`

함수 이름.

`param`

함수로 전달되는 인수(argument)의 이름. 인수의 최대 개수는 엔진마다 다름.

`statements`

함수의 몸통(body)을 구성하는 문(statement).

설명
--

함수 선언으로 생성된 함수는 `Function` 객체로, `Function` 객체의 모든 속성(property), 메서드 및 행위 특성(behavior)을 갖습니다. 함수에 관한 더 자세한 정보는 `Function` 참조하시기 바랍니다.

함수는 또한 표현식(`함수 표현식` 참조)을 사용하여 생성될 수 있습니다.

기본적으로 함수는 `undefined`를 반환합니다. 다른 값을 반환하기 위해서는, 함수는 반환값을 지정하는 `return` 문이 있어야 합니다.

### 조건부로 생성되는 함수

함수는 조건부로 선언될 수 있습니다. 즉, function 문은 `if` 문 안에 들어갈 수 있습니다. 하지만, 구현에 따라 결과에 일관성이 없으므로 이 패턴은 실제 코드에서는 사용해선 안됩니다. 조건부로 함수를 생성하고자 한다면, 함수 표현식(function expression)을 대신 사용하세요.


```js
var hoisted = "foo" in this;
console.log(
  `'foo' name ${
 hoisted ? "is" : "is not"
 } hoisted. typeof foo is ${typeof foo}`,
);
if (false) {
  function foo() {
    return 1;
  }
}

// In Chrome:
// 'foo' name is hoisted. typeof foo is undefined
//
// In Firefox:
// 'foo' name is hoisted. typeof foo is undefined
//
// In Edge:
// 'foo' name is not hoisted. typeof foo is undefined
//
// In Safari:
// 'foo' name is hoisted. typeof foo is function
```


결과는 참으로 평가되는 조건과 정확하게 일치합니다.


```js
var hoisted = "foo" in this;
console.log(
  `'foo' name ${
 hoisted ? "is" : "is not"
 } hoisted. typeof foo is ${typeof foo}`,
);
if (true) {
  function foo() {
    return 1;
  }
}

// In Chrome:
// 'foo' name is hoisted. typeof foo is undefined
//
// In Firefox:
// 'foo' name is hoisted. typeof foo is undefined
//
// In Edge:
// 'foo' name is not hoisted. typeof foo is undefined
//
// In Safari:
// 'foo' name is hoisted. typeof foo is function
```

### 함수 선언 끌어올리기

JavaScript에서 함수 선언은 그 선언을 둘러싼 함수의 최상부나 전역 범위(global scope)로 끌어올려집니다.


```js
hoisted(); // logs "foo"

function hoisted() {
  console.log("foo");
}
```


`함수 표현식`은 끌어올려지지 않으므로 주의하세요:


```js
notHoisted(); // TypeError: notHoisted is not a function

var notHoisted = function () {
  console.log("bar");
};
```

예제
--

### `function` 사용하기

다음 코드는 제품 `a`, `b` 및 `c`의 단위 판매량이 주어졌을 때, 총 판매량을 반환하는 함수를 선언합니다.


```js
function calc\_sales(units\_a, units\_b, units\_c) {
  return units_a \* 79 + units_b \* 129 + units_c \* 699;
}
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-function-definitions |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* `함수 및 함수 범위`
* `Function`
* `함수 표현식`
* `function* 문`
* `function* 식`
* `화살표 함수`
* `GeneratorFunction`
do...while
==========

**`do...while` 문은** 테스트 조건이 거짓으로 평가될 때까지 지정된 구문을 실행하는 루프를 만듭니다.
 단, 구문이 실행된 뒤에 테스트 조건이 평가됨으로 구문은 무조건 한 번은 실행됩니다.

시도해보기
-----

문법
--


```js
do {
  statement;
} while (condition);
```


`구문`

테스트 조건이 참일 때마다 한 번이상 실행되는 구문입니다. 만약 루프 내에서 여러 구문을 반복 실행 시키고 싶으시다면, 다음 명령을 사용합니다. block 구문을 활용하여 (`{ ... }`) 이런 식으로 그룹화합니다.

`조건식`

루프가 실행될 때마다 평가되는 식입니다. 만약 조건식이 참으로 평가되었다면, `구문` 이 다시 실행됩니다. 만약 조건식이 거짓으로 평가되었다면, JavaScript는 `do...while`. 구문 밑에 있는 구문들을 실행시킵니다.

예제
--

### `do...while`

예제에서 `do...while` 문은 적어도 한번 반복되고 i 변수가 5 보다 작을 때까지 실행됩니다.


```js
var result = "";
var i = 0;
do {
  i += 1;
  result += i + " ";
} while (i > 0 && i < 5);
// Despite i == 0 this will still loop as it starts off without the test

console.log(result);
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-do-while-statement |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* `while`
* `for`
empty
=====

**empty** 문은 JavaScript 아무것도 동작하지 않습니다.

시도해보기
-----

구문
--


```js
;
```

설명
--

empty statement은 JavaScript구문에 하나가 필요할 때 어떤 문도 실행되지 않을 것이라는 것을 나타내는 세미 콜론(;)입니다. 여러개의 문장을 원하지만 JavaScript는 block statement을 사용하여 하나만 허용하며 여러개의 문장을 하나로 결합합니다.

예제
--

빈 문은 루프 문과 함께 사용되기도합니다. 빈 루프 본문이있는 다음 예제를 참조하십시오.


```js
var arr = [1, 2, 3];

// Assign all array values to 0
for (i = 0; i < arr.length; arr[i++] = 0 /\* empty statement \*/);

console.log(arr);
// [0, 0, 0]
```


**참고:** 정상적인 세미 콜론을 구분하는 것이 그리 쉽지 않기 때문에, empty statement를 사용할 때는 의도적으로 주석을 달아주는것이 좋습니다. 다음 예 에서는 의도한대로 코드가 동작하지 않을것입니다. 아마도 killTheUniverse()를 if문 안에서 실행하고자 했던것 같습니다.


```js
if (condition);       // Caution, this "if" does nothing!
   killTheUniverse()  // So this always gets executed!!!
```


다른 예 : 중괄호 ({})가없는 `if...else` 문에서 `three`가 `true`이면 아무 일도 일어나지 않고 `four`를 건너 뛰고 else case의 launchRocket() 함수도 실행되지 않습니다.


```js
if (one) doOne();
else if (two) doTwo();
else if (three); // nothing here
else if (four)
  doFour();
else launchRocket();
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-empty-statement |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

See also
--------

* `Block statement`
debugger
========

**`debugger` 문**은 중단점 설정 등 현재 사용할 수 있는 디버그 기능을 호출합니다. 사용할 수있는 디버깅 기능이 없으면 아무런 동작도 하지 않습니다.

구문
--


```js
debugger;
```

예제
--

다음 예제에서는 함수가 호출 시 디버거를 활성화하도록 `debugger`를 삽입한 모습입니다.


```js
function potentiallyBuggyCode() {
  debugger;
  // 버그가 있을 것으로 생각하는 코드를 분석하거나, 한 단계씩 진행해보거나...
}
```


디버거가 활성화되면 디버거 문의 위치에서 실행이 일시중지됩니다. 스크립트 소스의 중단점과 비슷합니다.

![Paused at a debugger statement.](/ko/docs/Web/JavaScript/Reference/Statements/debugger/screen_shot_2014-02-07_at_9.14.35_am.png)

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-debugger-statement |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* JavaScript 디버깅
* Firefox 개발자 도구의 디버거
return
======

**`return` 명령문**은 함수 실행을 종료하고, 주어진 값을 함수 호출 지점으로 반환합니다.

시도해보기
-----

구문
--


```js
return [[expression]];
```


`expression`

반환할 값으로 사용할 표현식. 생략할 경우 `undefined`를 대신 반환합니다.

설명
--

함수 본문에서 `return` 명령문에 도달하면 함수의 실행은 그 지점에서 중단됩니다. 값을 제공한 경우 함수를 호출한 곳에 그 값을 반환합니다. 예를 들어, 다음 함수는 숫자 매개변수 `x`의 제곱을 반환합니다.


```js
function square(x) {
  return x \* x;
}
var demo = square(3);
// demo는 9
```


값을 명시하지 않으면 대신 `undefined`를 반환합니다.

다음 `return` 명령문 모두 함수 실행을 끊습니다.


```js
return;
return true;
return false;
return x;
return x + y / 3;
```

### 자동 세미콜론 삽입

`return` 명령문은 자동 세미콜론 삽입(ASI) (en-US)의 영향을 받습니다. `return` 키워드와 표현식 사이에는 줄바꿈 문자가 올 수 없습니다.


```js
return
a + b;
```


위 코드는 ASI로 인해 아래처럼 처리됩니다.


```js
return;
a + b;
```


콘솔이 "unreachable code after return statement" 경고를 출력할 것입니다.

문제를 해결하려면 괄호를 사용해 ASI를 방지해야 합니다.


```js
return a + b;
```

예제
--

### 함수 중단

함수는 `return`을 호출하는 지점에서 즉시 실행을 멈춥니다.


```js
function counter() {
  for (var count = 1; ; count++) {
    // 무한 반복
    console.log(count + "A"); // 5까지
    if (count === 5) {
      return;
    }
    console.log(count + "B"); // 4까지
  }
  console.log(count + "C"); // 절대 나타나지 않음
}

counter();

// 출력:
// 1A
// 1B
// 2A
// 2B
// 3A
// 3B
// 4A
// 4B
// 5A
```

### 함수 반환하기

클로저에 대해서도 더 알아보세요.


```js
function magic(x) {
  return function calc(x) {
    return x \* 42;
  };
}

var answer = magic();
answer(1337); // 56154
```

명세서
---

| Specification |
| --- |
| ECMAScript Language Specification # sec-return-statement |

브라우저 호환성
--------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

같이 보기
-----

* 함수
* 클로저