recursal/MDN huggingface dataset:
SyntaxError: function statement requires a name
===============================================

메세지
---
```

    Syntax Error: Expected identifier (Edge)
    SyntaxError: function statement requires a name [Firefox]
    SyntaxError: Unexpected token ( [Chrome]
```

에러 타입
-----

`SyntaxError`무엇이 잘못되었을까?
-----------

함수 구문(Function statement)은 이름이 필수입니다. 함수가 정의된 방법에 따라 함수의 이름을 짓거나 함수 표현식(Function expression) IIFE으로 작성하거나, 함수가 맥락에 맞게 제대로 작성되었는지 확인해야 합니다.

예제
--

### 구문 vs 표현식

함수 구문(또는 함수 선언)은 이름이 필요하므로 아래 예제는 동작하지 않습니다:


```js
function () {
  return 'Hello world';
}
// SyntaxError: function statement requires a name
```


대신 함수 표현식을 사용할 수 있습니다:


```js
var greet = function () {
  return "Hello world";
};
```


또는, 선언하자마자 바로 실행되는 IIFE (Immediately Invoked Function Expression)를 사용할 수 있습니다. 이 경우 몇 개의 괄호가 더 필요합니다:


```js
(function () {})();
```

### 레이블을 붙인 함수

만약 함수 레이블을 사용하는 경우 `function` 키워드 뒤에 함수 이름이 필요하므로 아래 예제는 동작하지 않습니다:


```js
function Greeter() {
  german: function () {
    return "Moin";
  }
}
// SyntaxError: function statement requires a name
```


아래 예제는 동작합니다:


```js
function Greeter() {
  german: function g() {
    return "Moin";
  }
}
```

### 객체 메소드

만약 객체 메소드를 만드는 경우 먼저 객체를 만들어야 합니다. 객체 메소드의 경우 아래 예제와 같이 `function` 키워드 뒤에 이름이 없어도 정상적으로 동작합니다.


```js
var greeter = {
  german: function () {
    return "Moin";
  },
};
```

### 콜백 구문

콜백을 사용하는 경우 구문을 확인해야 합니다. 괄호와 쉼표는 구문을 어렵게 만듭니다.


```js
promise.then(
  function() {
    console.log("success");
  });
  function() {
    console.log("error");
}
// SyntaxError: function statement requires a name
```


올바르게 변경하면:


```json
promise.then(
  function() {
    console.log("success");
  },
  function() {
    console.log("error");
  }
);
```

같이 보기
-----

* 함수
* 함수 구문
* 함수 표현식
* IIFE
* 레이블
SyntaxError: for-in loop head declarations may not have initializers
====================================================================

메세지
---
```

    SyntaxError: for-in loop head declarations cannot have an initializer (Edge)
    SyntaxError: for-in loop head declarations may not have initializers (Firefox)
    SyntaxError: for-in loop variable declaration may not have an initializer. (Chrome)
```

에러 타입
-----

엄격(Strict) 모드에서의 `SyntaxError`.

무엇이 잘못되었을까?
-----------

for...in 반복문의 선언부에 초기화 구문이 포함되어 있습니다. 즉, |`for (var i = 0 in obj)`| 구문을 통해 변수가 정의되고 값이 할당된 것을 말합니다. 비엄격 모드(non-strict) 모드에서는 이 초기화 구문이 무시되어 `|for (var i in obj)|` 처럼 동작합니다. 하지만 엄격 모드에서는 `SyntaxError` 가 발생합니다.

예제
--

이 예제는 `SyntaxError`를 발생시킵니다.


```js
"use strict";

var obj = {a: 1, b: 2, c: 3 };

for (var i = 0 in obj) {
  console.log(obj[i]);
}

// SyntaxError: for-in loop head declarations may not have initializers
```

### 올바른 for-in 반복문

for-in 반복문의 선언부에서 초기화 구문(`i = 0`)을 삭제합니다.


```js
"use strict";

var obj = { a: 1, b: 2, c: 3 };

for (var i in obj) {
  console.log(obj[i]);
}
```

### 배열 반복

for...in 반복문은 배열을 반복하는데에는 사용하지 않습니다. 배열(`Array`)을 반복하기 위해 `for-in` 반복문 대신에 `for` 반복문을 사용하려고 한 적이 있습니까? `for` 반복문은 선언부에서 초기화도 할 수 있습니다:


```js
var arr = ["a", "b", "c"];

for (var i = 2; i < arr.length; i++) {
  console.log(arr[i]);
}

// "c"
```

같이 보기
-----

* `for...in`
* `for...of` – 엄격 모드와 비엄격 모드에서 모두 초기화를 허용하지 않습니다.
* `for` – 배열 반복에 적합하고 초기화도 가능합니다.
TypeError: "x" is read-only
===========================

메시지
---
```

    TypeError: "x" is read-only (Firefox)
    TypeError: 0 is read-only (Firefox)
    TypeError: Cannot assign to read only property 'x' of #<Object> (Chrome)
    TypeError: Cannot assign to read only property '0' of [object Array] (Chrome)
```

에러 유형
-----

`TypeError`무엇이 잘못 된 걸까?
------------

전역변수 또는 객체 프로퍼티가 읽기 전용으로 할당된 경우입니다.(엄밀히 따지자면 쓰기가 불가능한 데이터 속성입니다.)

이 에러는 엄격모드에서만 등장합니다. 엄격하지 않은 모드에서는 읽기전용 속성은 묵시적으로 무시됩니다.

예시
--

### 적절하지 않은 예

읽기 전용 속성은 아주 흔한 것은 아니지만, `Object.defineProperty()` 나 `Object.freeze()` 를 이용해 만들어 질 수 있습니다.


```js
"use strict";
var obj = Object.freeze({ name: "Elsa", score: 157 });
obj.score = 0; // TypeError

("use strict");
Object.defineProperty(this, "LUNG\_COUNT", { value: 2, writable: false });
LUNG\_COUNT = 3; // TypeError

("use strict");
var frozenArray = Object.freeze([0, 1, 2]);
frozenArray[0]++; // TypeError
```


자바 스크립트에는 몇 가지 읽기 전용 속성이 내장되어 있습니다. 아마도 수학적 상수를 재정의하려고 한 것 같습니다.


```js
"use strict";
Math.PI = 4; // TypeError
```


이렇게는 불가능합니다.

전역변수 `undefined` 또한 읽기전용으로, 사람들이 모두 좋아하지 않는 "undefined is not a function" 에러가 다음과 같은 경우 등장합니다:


```js
"use strict";
undefined = function () {}; // TypeError: "undefined" is read-only
```

### 적절한 예


```js
"use strict";
var obj = Object.freeze({ name: "Score", points: 157 });
obj = { name: obj.name, points: 0 }; // replacing it with a new object works

("use strict");
var LUNG\_COUNT = 2; // a `var` works, because it's not read-only
LUNG\_COUNT = 3; // ok (anatomically unlikely, though)
```

더보기
---

* `Object.defineProperty()`
* `Object.freeze()`
* "Which animals have three lungs?" on answers.com
* Klingons (another answer to that query)
ReferenceError: reference to undefined property "x"
===================================================

메시지
---
```

  ReferenceError: reference to undefined property "x" (Firefox)
```

에러 형식
-----

엄격 모드(strict mode)에서만 발생하는 `ReferenceError` 경고.

무엇이 잘못되었을까?
-----------

이 스크립트는 존재하지 않는 객체의 속성에 접근을 시도했습니다. 요소에 접근하는 방법에는 두 가지가 있습니다.; 더 자세히 알고 싶으시다면, 속성 접근자(property accessors) 참조 문서를 봐주세요.

정의되지 않은 속성 참조에 대한 에러는 엄격 모드 코드(strict mode code)에서만 발생합니다. 비-엄격모드의 코드에서는 존재하지 않는 속성에 대한 접근은 조용히 무시됩니다.

예
-

### 허용되지 않는 경우

이 경우에는, 속성 `bar` 는 정의되지 않은 속성으로, `ReferenceError` 가 발생합니다.


```js
"use strict";

var foo = {};
foo.bar; // ReferenceError: reference to undefined property "bar"
```

### 허용되는 경우

에러를 피하기 위해서는, 접근을 시도하기 앞서, 객체에 `bar` 에 대한 정의를 추가하거나 `bar` 속성의 존재 여부를 확인해야 합니다.; 아래와 같이 `Object.prototype.hasOwnProperty()` (en-US) method)를 사용하는 것이 하나의 방법이 될 수 있습니다.:


```js
"use strict";

var foo = {};

// bar 속성을 정의한다.

foo.bar = "moon";
console.log(foo.bar); // "moon"

// bar에 접근하기 전에 존재 하는지 확인한다.

if (foo.hasOwnProperty("bar") {
  console.log(foo.bar);
}
```

참조
--

* Strict mode
TypeError: "x" has no properties
================================

`null` 과 `undefined` 라는 속성에 접근하려고 시도할때 "null(혹은 undefined)은 속성이 없습니다"라는 JavaScript 에러가 발생합니다.

메세지
---
```

TypeError: Cannot read properties of undefined (reading 'x') (V8-based)
TypeError: null has no properties (Firefox)
TypeError: undefined has no properties (Firefox)
TypeError: undefined is not an object (evaluating 'undefined.x') (Safari)
```

에러 타입
-----

`TypeError`.

무엇이 잘못되었을까?
-----------

`null` 과 `undefined` 에 접근 할 수 있는 속성이 없습니다.

예제
--

### null and undefined have no properties


```js
null.foo;
// TypeError: null has no properties

undefined.bar;
// TypeError: undefined has no properties
```

참조
--

* `null`
* `undefined`
SyntaxError: "0"-prefixed octal literals and octal escape seq. are deprecated
=============================================================================

메시지
---
```

    SyntaxError: Octal numeric literals and escape characters not allowed in strict mode (Edge)
    SyntaxError:
    "0"-prefixed octal literals and octal escape sequences are deprecated;
    for octal literals use the "0o" prefix instead
```

에러 타입
-----

`SyntaxError` strict mode 내에서만.

무엇이 잘 못 되었을까?
-------------

8진 리터럴과 8진수 이스케이프 시퀀스는 더 이상 사용하지 않으며, 엄격 모드(strict mode) 내에서는 `SyntaxError` 에러를 던질 것입니다. ECMAScript 2015와 이 후의 버전의 표준화된 구문은 0을 맨 앞자리에 두고 그 뒤를 대문자 또는 소문자의 라틴 문자 "O" 를 사용하도록 합니다. (`0o` 또는 `0O)`

예제
--

### "0"이 접두인 8진 리터럴


```js
"use strict";

03;

// SyntaxError: "0"-prefixed octal literals and octal escape sequences
// are deprecated (0으로 시작하는 8진수와 8진 이스케이프 시퀀스는 더 이상 사용되지 않습니다. )
```

### 8진수 이스케이프 시퀀스


```js
"use strict";

"\251";

// SyntaxError: "0"-prefixed octal literals and octal escape sequences
// are deprecated (0으로 시작하는 8진수와 8진 이스케이프 시퀀스는 더 이상 사용되지 않습니다. )
```

### 유효한 8진 수들

0뒤에 "o" 또는 "O"를 사용합니다. :


```js
0o3;
```


8진수 이스케이프 시퀀스 대신 16진수 이스케이프 시퀀스를 사용할 수도 있습니다. :


```js
"\xA9";
```

See also
--------

* Lexical grammar (en-US)
* Warning: 08/09 is not a legal ECMA-262 octal constant (en-US)
ReferenceError: "x" is not defined
==================================

메시지
---
```

    ReferenceError: "x" is not defined
```

에러 타입
-----

`ReferenceError`.

무엇이 잘못되었을까?
-----------

존재하지 않는 변수를 참조하는 곳이 있습니다. 이 변수는 선언되어야 합니다. 또는, 현재 스크립트나 scope 에서 사용이 가능하도록 해야합니다.

**참고:** 라이브러리(예를 들면 jQuery와 같은)의 로딩은, 반드시 코드에서 "$"와 같은 라이브러리 변수에 접근하기 이전에 수행되어야 합니다. 라이브러리를 로딩하는 `<script>` 태그가 그 변수를 사용하는 코드보다 앞에 위치하도록 하세요.

예
-

### 선언되지 않은 변수


```js
foo.substring(1); // ReferenceError: foo is not defined
```


"foo" 변수는 어디에도 선언되지 않았습니다. `String.prototype.substring()` 메소드가 작동하도록 하기 위해서는 문자열을 필요로 합니다.


```js
var foo = "bar";
foo.substring(1); // "ar"
```

### 잘못된 스코프

변수는 현재의 실행 흐름 내에서 이용 가능해야합니다. 함수 내부에 정의된 변수는 다른 외부의 함수에서는 접근할 수 없습니다. 그 때문에, 변수는 함수의 스코프 내부에서만 정의 됩니다.


```js
function numbers() {
  var num1 = 2,
    num2 = 3;
  return num1 + num2;
}

console.log(num1); // ReferenceError: num1 is not defined
```


그러나, 함수는 모든 변수와 정의된 스코프 안에 정의된 함수에 접근할 수 있습니다. 따라서, 전역으로 정의된 함수는 전역에 정의된 모든 변수에도 접근할 수 있습니다.


```js
var num1 = 2,
  num2 = 3;

function numbers() {
  return num1 + num2;
}

console.log(num1); // 2
```

참조
--

* Scope
* Declaring variables in the JavaScript Guide
* Function scope in the JavaScript Guide
RangeError: argument is not a valid code point
==============================================

메시지
---
```

    RangeError: {0} is not a valid code point (Firefox)
    RangeError: Invalid code point {0} (Chrome)
```

에러 형식
-----

`RangeError`무엇이 잘못되었을까?
-----------

`String.fromCodePoint()` (en-US) 메소드는 유효한 코드 포인트(code point)만을 받아들입니다.

code point는 유니코드의 코드 스페이스 값으로, `0`부터 `0x10FFFF`까지의 정수 범위입니다.

`NaN`을 사용하는 값, 음수 (`-1`), 정수가 아닌 수(3.14), 또는 `0x10FFFF` (`1114111`) 보다 큰 값은 이 함수에 적용될 수 없습니다.

예
-

### 유효하지 않은 경우


```js
String.fromCodePoint("\_"); // RangeError
String.fromCodePoint(Infinity); // RangeError
String.fromCodePoint(-1); // RangeError
String.fromCodePoint(3.14); // RangeError
String.fromCodePoint(3e-2); // RangeError
String.fromCodePoint(NaN); // RangeError
```

### 유효한 경우


```js
String.fromCodePoint(42); // "\*"
String.fromCodePoint(65, 90); // "AZ"
String.fromCodePoint(0x404); // "\u0404"
String.fromCodePoint(0x2f804); // "\uD87E\uDC04"
String.fromCodePoint(194564); // "\uD87E\uDC04"
String.fromCodePoint(0x1d306, 0x61, 0x1d307); // "\uD834\uDF06a\uD834\uDF07"
```

참조
--

* `String.fromCodePoint()` (en-US)
TypeError: "x" is (not) "y"
===========================

Message
-------
```

    TypeError: "x" is (not) "y"

    Examples:
    TypeError: "x" is undefined
    TypeError: "x" is null
    TypeError: "undefined" is not an object
    TypeError: "x" is not an object or null
    TypeError: "x" is not a symbol
```

Error type
----------

`TypeError`.

What went wrong?
----------------

그것은 정확하지 않은 형태이다. 그것은 가끔`undefined` 나 `null` 값을 발생한다.

또한, `Object.create()` 또는 `Symbol.keyFor()`와 같은 메서드는 반드시 제공되어야하는 특별한 형태를 요구한다.

Examples
--------

### Invalid cases


```js
// undefined and null cases on which the substring method won't work
var foo = undefined;
foo.substring(1); // TypeError: foo is undefined

var foo = null;
foo.substring(1); // TypeError: foo is null

// Certain methods might require a specific type
var foo = {};
Symbol.keyFor(foo); // TypeError: foo is not a symbol

var foo = "bar";
Object.create(foo); // TypeError: "foo" is not an object or null
```

### Fixing the issue

undefined 나 null 값을 가진 null 포인터를 고치기 위해서 아래 예제와 같이 typeof 연산자를 사용할 수 있다.


```js
if (typeof foo !== "undefined") {
  // Now we know that foo is defined, we are good to go.
}
```

같이 보기
-----

* `undefined`
* `null`
SyntaxError: return not in function
===================================

 JavaScript 예외 "return (or yield) not in function"은
 `return`
 또는 `yield`
 이 function 외부에서 호출될 때 발생합니다.

메시지
---


```js
SyntaxError: 'return' statement outside of function (Edge)
  SyntaxError: return not in function (Firefox)
  SyntaxError: yield not in function (Firefox)
```

에러 타입
-----

`SyntaxError`.

무엇이 잘못된 걸까요?
------------

`return`
 또는 `yield`
 문장이 function 밖에서 호출되었기 때문입니다.
 혹시 어딘가에 중괄호를 빠트리신 건 아닌가요? `return`과 `yield`는 function 내에 있어야합니다.
 왜냐하면 이것들은 function의 실행 종료 (또는 일시정지 및 재개)를 의미하고 function 호출자에게 특정 값을 반환하기 위해 사용되기 때문입니다.

예제
--

### 중괄호 누락


```js
var cheer = function(score) {
  if (score === 147)
    return 'Maximum!';
  };
  if (score > 100) {
    return 'Century!';
  }
}

// SyntaxError: return not in function
```


처음 볼 때는 중괄호가 제대로 있는 것처럼 보인다, 하지만 이 코드 조각에는 if 문장 다음에 중괄호가 하나 빠져 있다. 다음처럼 고쳐야 한다:


```js
var cheer = function (score) {
  if (score === 147) {
    return "Maximum!";
  }
  if (score > 100) {
    return "Century!";
  }
};
```

같이 보기
-----

* `return`
* `yield`
RangeError: invalid date
========================

메시지
---
```

    RangeError: invalid date (Firefox)
    RangeError: invalid time value (Chrome)
    RangeError: Provided date is not in valid range (Chrome)
```

에러 종류
-----

`RangeError`무엇이 잘못 된 걸까?
------------

유효하지 않은 String이 `Date` 나 `Date.parse()`에 입력되었습니다.

예시
--

### 올바르지 않은 사용 예시

인식 할 수 없는 string이나 잘못된 요소 값을 포함하는 ISO 형식의 날짜 string은 일반적으로 `NaN`을 반환합니다. 그러나 구현 방식에 따라 ISO 형식 string을 따르지 않는 경우 `RangeError: invalid date`가 표시 될 수 있습니다. Firefox의 경우:


```js
new Date("foo-bar 2014");
new Date("2014-25-23").toISOString();
new Date("foo-bar 2014").toString();
```


그러나 이 경우, Firefox에서는 `NaN` 을 반환합니다:


```js
Date.parse("foo-bar 2014"); // NaN
```


더 자세한 사항은 `Date.parse()` 문서를 참고하세요.

### 올바른 사용 예시


```js
new Date("05 October 2011 14:48 UTC");
```

더 보기
----

* `Date`
* `Date.prototype.parse()`
* `Date.prototype.toISOString()`
TypeError: 'x' is not iterable
==============================

메시지
---
```

    TypeError: 'x' is not iterable (Firefox, Chrome)
    TypeError: 'x' is not a function or its return value is not iterable (Chrome)
```

에러 타입
-----

`TypeError`무엇이 문제인가요?
----------

`Promise.all` 또는 `TypedArray.from` (en-US) 과 같은 함수의 아규먼트 또는 for…of 의 right hand-side 로 주어진 값이 iterable 객체가 아닙니다. iterable 은 `Array`, `String` 또는 `Map`, 생성자 결과, 또는 iterable protocol 구현 객체와 같은 내장 iterable 타입이 될 수 있습니다.

예제
--

### 모든 객체 프로퍼티 iterating

 JavaScript 에서 iterable protocol 을 구현하지 않은 `Object` 는 iterable 이 아닙니다.
 그러므로, 객체의 프로퍼티를 반복하기 위해 for…of 를 사용하면 안됩니다.


```js
var obj = { France: "Paris", England: "London" };
for (let p of obj) {
  // TypeError: obj is not iterable
  // …
}
```


객체의 모든 항목 또는 프로퍼티를 반복하려면 대신 `Object.keys` 또는 `Object.entries` 를 사용해야 합니다.


```js
var obj = { France: "Paris", England: "London" };
// 모든 프로퍼티 이름을 iterate:
for (let country of Object.keys(obj)) {
  var capital = obj[country];
  console.log(country, capital);
}

for (const [country, capital] of Object.entries(obj))
  console.log(country, capital);
```


이 유즈 케이스에 대한 다른 옵션은 `Map` 을 사용하는 것입니다.


```js
var map = new Map();
map.set("France", "Paris");
map.set("England", "London");
// 모든 프로퍼티 이름 iterate
for (let country of map.keys()) {
  let capital = map[country];
  console.log(country, capital);
}

for (let capital of map.values()) console.log(capital);

for (const [country, capital] of map.entries()) console.log(country, capital);
```

### Generator iterating

Generators 는 iterable 객체를 생성하기 위해 호출하는 함수입니다.


```js
function\* generate(a, b) {
  yield a;
  yield b;
}

for (let x of generate) // TypeError: generate is not iterable
  console.log(x);
```


generator 가 호출되지 않으면, generator 에 해당하는 `Function` 객체를 호출할수는 있지만 interable 하지는 않습니다. generator 호출은 generator 실행동안 yield 된 모든 값을 iterate 하는 iterable 객체를 생성합니다.


```js
function\* generate(a, b) {
  yield a;
  yield b;
}

for (let x of generate(1, 2)) console.log(x);
```

함께 보기
-----

* iterable protocol
* `Object.keys`
* `Object.entries`
* `Map`
* generators
* for…of
SyntaxError: missing } after property list
==========================================

메시지
---
```

    SyntaxError: missing } after property list
```

에러 유형
-----

`SyntaxError`무엇이 잘못 된 걸까?
------------

객체를 초기화 하는 부분 어딘가에 구문에 실수가 있습니다. 실제로 빠진 중괄호 일 수도 있지만, 누락 된 쉼표 일 수도 있습니다. 또한 닫는 중괄호나 괄호가 올바른 순서인지 확인하세요. 코드를 들여쓰기하거나 서식을 지정하면 좀 더 보기 쉽습니다.

예시
--

### 쉼표를 까먹은 경우

종종 객체 초기화 과정에서 쉼표를 빠트리는 경우가 있습니다:


```js
var obj = {
  a: 1,
  b: { myProp: 2 }
  c: 3
};
```


올바른 예시는 다음과 같습니다:


```js
var obj = {
  a: 1,
  b: { myProp: 2 },
  c: 3,
};
```

더 보기
----

* Object initializer
RangeError: repeat count must be less than infinity
===================================================

메시지
---
```

    RangeError: repeat count must be less than infinity and not overflow maximum string size (Firefox)
    (repeat count는 infinity보다 작아야하며, 최대 문자열 크기를 넘길 수 없습니다.)

    RangeError: Invalid count value (Chrome)
```

에러 형식
-----

`RangeError`무엇이 잘못되었을까?
-----------

`String.prototype.repeat()` 메소드가 사용되었습니다. 이 메소드는 문자열을 반복하는 수를 예측하는 카운트 파라메터를 가지고 있었습니다. 그리고 이 파라메터는 0보다 커야하며, 양의 `Infinity` 보다 작아야 했으며, 음수는 허용되지 않았습니다. 이 값의 허용 범위는 이렇게 표현될 수 있습니다. : [0, +∞).

결과인 문자열은 최대 문자열 크기보다 클 수 없지만, JavaScript 에서는 다를 수 있습니다. Firefox (SpiderMonkey) 에서의 최대 문자열 크기는 2^28 -1 (`0xFFFFFFF`)입니다.

예
-

### 허용되지 않는 경우


```js
"abc".repeat(Infinity); // RangeError
"a".repeat(2 \*\* 28); // RangeError
```

### 허용되는 경우


```js
"abc".repeat(0); // ''
"abc".repeat(1); // 'abc'
"abc".repeat(2); // 'abcabc'
"abc".repeat(3.5); // 'abcabcabc' (숫자는 정수로 변환될 것입니다.)
```

참조
--

* `String.prototype.repeat()`
RangeError: precision is out of range
=====================================

메시지
---
```

    RangeError: precision {0} out of range (Firefox)
    RangeError: toExponential() argument must be between 0 and 20 (Chrome)
    RangeError: toFixed() digits argument must be between 0 and 20 (Chrome)
    RangeError: toPrecision() argument must be between 1 and 21 (Chrome)
```

에러 형식
-----

`RangeError`무엇이 잘못되었을까?
-----------

아래의 메소드들 중 하나에서, 실행 인자(argument)가 정확도의 범위를 벗어났습니다. :

* `Number.prototype.toExponential()`
* `Number.prototype.toFixed()`
* `Number.prototype.toPrecision()`

이 메소드들에게 허용된 범위는 0부터 20 (또는 21)까지 입니다. 하지만, ECMAScript 스펙은 아래의 범위까지 확장하여 허용하고 있습니다.

| Method | Firefox (SpiderMonkey) | Chrome, Opera (V8) |
| --- | --- | --- |
| `Number.prototype.toExponential()` | 0 부터 100 | 0 부터 20 |
| `Number.prototype.toFixed()` | -20 부터 100 | 0 부터 20 |
| `Number.prototype.toPrecision()` | 1 부터 100 | 1 부터 21 |

예
-

### 유효하지 않은 경우


```js
(77.1234).toExponential(-1); // RangeError
(77.1234).toExponential(101); // RangeError

(2.34).toFixed(-100); // RangeError
(2.34).toFixed(1001); // RangeError

(1234.5).toPrecision(-1); // RangeError
(1234.5).toPrecision(101); // RangeError
```

### 유효한 경우


```js
(77.1234).toExponential(4); // 7.7123e+1
(77.1234).toExponential(2); // 7.71e+1

(2.34).toFixed(1); // 2.3
(2.35).toFixed(1); // 2.4 (note that it rounds up in this case)

(5.123456).toPrecision(5); // 5.1235
(5.123456).toPrecision(2); // 5.1
(5.123456).toPrecision(1); // 5
```

참조
--

* `Number.prototype.toExponential()`
* `Number.prototype.toFixed()`
* `Number.prototype.toPrecision()`
RangeError: radix must be an integer
====================================

 JavaScript 예외 "radix must be an integer at least 2 and no greater than 36"는
 `Number.prototype.toString()` 또는 `BigInt.prototype.toString()` (en-US)
 메서드의 선택적 매개 변수가 지정된 경우 2에서 36 사이여야 합니다.

메시지
---


```js
  RangeError: invalid argument (Edge)
  RangeError: radix must be an integer at least 2 and no greater than 36 (Firefox)
  RangeError: toString() radix argument must be between 2 and 36 (Chrome)
```

에러 형식
-----

`RangeError`무엇이 잘못되었을까?
-----------

`Number.prototype.toString()` 또는
 `BigInt.prototype.toString()` (en-US)
 메서드는 선택적 파라미터인 `radix`(기수: 진수를 지정하는 값)와 함게 사용되어 왔습니다.
 이 파라미터는 반드시 수의 값을 나타내는 진법 2와 36 사이로 지정된 정수(숫자)여야 합니다.

 이 매개 변수의 값이 36으로 제한된 이유는 무엇일까요?
 10보다 큰 기수는 알파벳 문자를 숫자로 사용하기 때문입니다.
 따라서 기수는 36을 초과할 수 없습니다. 라틴 알파벳(영어와 다른 많은 언어에서 사용됨)은 26자뿐이기 때문입니다.

보통 아래의 `radix` 중 하나를 사용하게 될 것입니다.

* 2 for binary numbers (2진수),
* 8 for octal numbers (8진수),
* 10 for decimal numbers (10진수),
* 16 for hexadecimal numbers (16진수).
예제
--

### 허용되지 않는 경우


```js
(42).toString(0);
(42).toString(1);
(42).toString(37);
(42).toString(150);
//포맷팅하기 위해 string을 이런 식으로 사용할 수는 없습니다. :
(12071989).toString("MM-dd-yyyy");
```

### 허용된 경우


```js
(42).toString(2); // "101010" (2진수)
(13).toString(8); // "15" (8진수)
(0x42).toString(10); // "66" (10진수)
(100000).toString(16); // "186a0" (16진수)
```

또 다른 내용
-------

* `Number.prototype.toString()`
* `BigInt.prototype.toString()` (en-US)
InternalError: too much recursion
=================================

메시지
---
```

    InternalError: too much recursion
```

에러 형식
-----

`InternalError`.

무엇이 잘못되었을까?
-----------

자신을 호출하는 함수를 재귀 함수라고 합니다. 어떤 면에서, 재귀는 반복과 유사합니다. 둘 다 같은 코드를 여러 번 실행하며, 조건(무한 반복 피하기, 더 정확히 여기서 말하는 무한 재귀)이 있습니다. 너무 많거나 무한 번의 재귀가 발생할 경우, JavaScript는 이 에러를 던질 것입니다.

예
-

이 재귀 함수는 exit 조건에 따라 10번을 실행합니다.


```js
function loop(x) {
  if (x >= 10) {
    // "x >= 10" is the exit condition
    return;
  }
  // do stuff
  loop(x + 1); // the recursive call
}
loop(0);
```


이 조건에 대하여 너무 높은 값을 설정 하면 작동하지 않게 됩니다.


```js
function loop(x) {
  if (x >= 1000000000000) return;
  // do stuff
  loop(x + 1);
}
loop(0);

// InternalError: too much recursion
```

참조
--

* Recursion
* Recursive functions
ReferenceError: assignment to undeclared variable "x"
=====================================================

메시지
---
```

    ReferenceError: assignment to undeclared variable "x" (Firefox)
    ReferenceError: "x" is not defined (Chrome)
    ReferenceError: Variable undefined in strict mode (Edge)
```

에러 형식
-----

엄격 모드(strict mode)에서만 발생하는 `ReferenceError` 경고.

무엇이 잘못되었을까?
-----------

선언되지 않은 변수로 값은 할당되었습니다. `var` 키워드가 없이 할당이 된 것입니다. 선언된 변수와 선언되지 않은 변수 사이에는 차이가 있는데, 이는 예상치 못한 결과를 가져오며, 때문에 JavaScript 엄격모드에서는 에러를 발생시키고 있습니다.

선언된 변수와 선언되지 않은 변수에 대하여 기억해야 할 세 가지:

* 선언된 변수는 선언된 실행 맥락 내에서 요구됩니다. 선언되지 않은 변수는 항상 전역의 특성을 띱니다.
* 선언된 변수는 코드가 실행되기 전에 생성됩니다. 선언되지 않은 변수는 실행을 위해 할당이 일어날 때까지 존재하지 않습니다.
* 선언된 변수는 실행 맥락 내(함수나 전역적인)에서 변경 불가한 요소입니다. 선언되지 않은 변수는 변경이 가능합니다. (삭제 될 수도 있습니다.)

더 많은 설명과 예제를 필요로 한다면 이 `var` 참조문서 페이지를 보세요.

선언되지 않은 변수 할당에 대한 에러는 엄격 모드(strict mode code)에서만 발생합니다. 비-엄격 코드에서는 조용히 묵인됩니다.

예
-

### 허용되지 않는 경우

이런 경우에는, 변수 "bar"는 선언되지 않은 변수가 됩니다.


```js
function foo() {
  "use strict";
  bar = true;
}
foo(); // ReferenceError: assignment to undeclared variable bar
```

### 허용되는 경우

"bar" 를 선언된 변수로 만들기 위해서, `var` 키워드를 변수명 앞에 붙여줍니다.


```js
function foo() {
  "use strict";
  var bar = true;
}
foo();
```

참조
--

* Strict mode
SyntaxError: a declaration in the head of a for-of loop can't have an initializer
=================================================================================

메세지
---
```

  SyntaxError: for-of loop head declarations cannot have an initializer (Edge)
  SyntaxError: a declaration in the head of a for-of loop can't have an initializer (Firefox)
  SyntaxError: for-of loop variable declaration may not have an initializer. (Chrome)
```

에러 타입
-----

`SyntaxError`무엇이 잘못되었을까?
-----------

for...of 반복문의 식이 초기화 구문을 포함한 것이 문제입니다. 즉, |`for (var i = 0 of iterable)`| 구문을 통해 변수가 정의되고 값이 할당된 것을 말합니다. 이 구문은 for-of 반복문에서 허용되지 않습니다. 이 경우 초기화를 할 수 있는 for 반복문이 필요합니다.

예제
--

### 잘못된 for-of 반복문


```js
let iterable = [10, 20, 30];

for (let value = 50 of iterable) {
  console.log(value);
}

// SyntaxError: a declaration in the head of a for-of loop can't
// have an initializer
```

### 올바른 `for-of` 반복문

for-of 반복문에서 초기화 구문(`value = 50`)을 삭제해야 합니다. 50을 더하고 싶다면 다음 예제와 같이 반복문 안에 추가할 수 있습니다.


```js
let iterable = [10, 20, 30];

for (let value of iterable) {
  value += 50;
  console.log(value);
}
// 60
// 70
// 80
```

같이 보기
-----

* `for...of`
* `for...in` – 엄격(Strict) 모드에서는 마찬가지로 초기화를 허용하지 않습니다. (SyntaxError: for-in loop head declarations may not have initializers)
* `for` – 초기화를 허용합니다.