const
JavaScript에서 특정 유형의 값 , 특히 함수를 사용하여 설정할 수있는 값에 제한이 있는지 궁금 합니다. 이것이 유효합니까? 그것은 효과가 있지만 어떤 이유로 나쁜 습관으로 간주됩니까?
const doSomething = () => {
...
}
ES6에서 모든 기능을 이런 식으로 정의해야합니까? 그렇다면, 이것이 붙잡힌 것처럼 보이지 않습니다.
의견 주셔서 감사합니다!
답변
수행 한 작업에는 문제가 없지만 함수 선언과 함수 표현식의 차이점을 기억해야합니다.
함수 선언 :
function doSomething () {}
범위의 상단에 완전히 빠진 (과 같다 let
및 const
그들 블록도 범위이다).
이는 다음이 작동 함을 의미합니다.
doSomething() // works!
function doSomething() {}
함수 표현식은 다음과 같습니다.
[const | let | var] = function () {} (or () =>
익명 함수 ( function () {}
)를 만들고 변수를 만든 다음 해당 익명 함수를 해당 변수에 할당합니다.
따라서 범위 내 변수 호이 스팅에 대한 일반적인 규칙-블록 범위 변수 ( let
및 const
)는 undefined
해당 블록 범위의 맨 위로 호이스트하지 않습니다 .
이것은 다음을 의미합니다.
if (true) {
doSomething() // will fail
const doSomething = function () {}
}
doSomething
정의되지 않았으므로 실패 합니다. (을 던질 것이다 ReferenceError
)
사용으로 전환 var
하면 변수를 게양하지만 undefined
위의 코드 블록이 여전히 작동하지 않도록 초기화됩니다 . (이것은 호출 할 때 함수가 아니기 TypeError
때문에 throw doSomething
합니다)
표준 관행에 따라 작업에 적합한 도구를 항상 사용해야합니다.
Axel Rauschmayer는 es6 의미론 : ES6의 변수 및 범위 지정을 포함하여 범위 및 호이 스팅에 대한 훌륭한 게시물을 보유하고 있습니다.
답변
const
함수를 정의하는 데 사용 하는 것은 해킹처럼 보이지만 (제 의견으로는) 우월하게 만드는 몇 가지 장점이 있습니다.
-
함수를 변경할 수 없으므로 다른 코드 조각으로 해당 함수가 변경되는 것에 대해 걱정할 필요가 없습니다.
-
짧고 깔끔한 팻 화살표 구문을 사용할 수 있습니다.
-
화살표 기능을 사용하면
this
바인딩 이 처리 됩니다.
예를 들어 function
// define a function
function add(x, y) { return x + y; }
// use it
console.log(add(1, 2)); // 3
// oops, someone mutated your function
add = function (x, y) { return x - y; };
// now this is not what you expected
console.log(add(1, 2)); // -1
같은 예 const
// define a function (wow! that is 8 chars shorter)
const add = (x, y) => x + y;
// use it
console.log(add(1, 2)); // 3
// someone tries to mutate the function
add = (x, y) => x - y; // Uncaught TypeError: Assignment to constant variable.
// the intruder fails and your function remains unchanged
답변
이 질문을받은 지 3 년이 지났지 만 지금 막 질문을하게되었습니다. 이 답변은 지금까지 스택 아래에 있으므로 반복 할 수 있습니다.
Q : JavaScript의 const (특히 함수)를 사용하여 설정할 수있는 값 유형에 대한 제한이 있는지 궁금합니다. 이것이 유효합니까? 그것은 효과가 있지만 어떤 이유로 나쁜 습관으로 간주됩니까?
명백한 이유 / 혜택이없는 경우에도 항상const
for 문을 사용 하는 많은 JavaScript 코더를 관찰 한 후 약간의 연구를하게되었습니다 functions
.
” 어떤 이유로 든 나쁜 관행으로 간주됩니까? “에 대한 대답으로 , IMO는 그렇습니다. 또는 적어도 진술 을 사용하면 이점 이 있습니다 function
.
이것은 주로 선호와 스타일의 문제인 것 같습니다. 위에 제시된 몇 가지 좋은 주장이 있지만이 기사에서
언급 한 것만 큼 명확하지는 않습니다. 지속적인 혼란 : 왜 medium.freecodecamp.org/Bill Sourour, JavaScript 전문가, 컨설턴트 및 교사가 JavaScript 함수 명령문 을 사용합니까?
이미 결정을 내렸다고해도 모든 사람이 해당 기사를 읽도록 권장합니다.
요점은 다음과 같습니다.
함수 문장은 [const] 함수 표현식에 비해 두 가지 분명한 장점이 있습니다.
장점 # 1 : 의도의 명확성
하루에 수천 줄의 코드를 스캔 할 때 가능한 한 빠르고 쉽게 프로그래머의 의도를 파악할 수 있습니다.
장점 # 2 : 선언 순서 == 실행 순서
이상적으로는 코드가 실행 될 것으로 예상되는 순서대로 코드를 선언하고 싶습니다.
이것은 나를위한 showtopper입니다 : const 키워드를 사용하여 선언 된 모든 값은 실행에 도달 할 때까지 액세스 할 수 없습니다.
위에서 방금 설명한 내용은 거꾸로 보이는 코드를 작성해야합니다. 우리는 가장 낮은 수준의 기능으로 시작하여 발전해야합니다.
내 두뇌는 그런 식으로 작동하지 않습니다. 세부 사항보다 컨텍스트를 원합니다.
대부분의 코드는 인간이 작성합니다. 따라서 대부분의 사람들이 이해하는 순서는 대부분의 코드 실행 순서를 거의 따르는 것이 합리적입니다.
답변
사용에 매우 중요한 이점이 있으며 const
, 일부는 그것이 의도적이고 표시 적이므로 가능하면 어디에서나 사용해야한다고 말합니다.
내가 알 수있는 한, JavaScript에서 변수를 가장 명확하고 예측 가능하게 선언하고, 그것이 얼마나 제한되어 있는지에 대한 가장 유용한 변수 중 하나입니다. 왜? 사용 가능한 일부 선언 var
과 let
선언 을 제거하기 때문 입니다.
읽을 때 무엇을 추론 할 수 const
있습니까? const
선언문 을 읽고 해당 변수에 대한 다른 참조를 스캔하지 않고 다음 사항을 모두 알고 있습니다 .
- 값은 해당 변수에 바인딩됩니다 (기본 객체는 변경할 수 없지만)
- 즉시 포함하는 블록 외부에 액세스 할 수 없습니다
- TDZ (Temporal Dead Zone) 규칙으로 인해 선언 전에 바인딩에 액세스 할 수 없습니다.
다음 인용문은 및 의 장점을 주장 하는 기사 에서 인용 한 것입니다 . 또한 키워드의 제약 조건 / 한계에 대한 질문에보다 직접적으로 답변합니다.let
const
등이 제공하는 것과 같은 제약
let
하고const
이해하기 쉬운 코드를 만드는 강력한 방법입니다. 작성하는 코드에서 이러한 제약 조건을 최대한 많이 적용하십시오. 코드가 의미 할 수있는 것을 제한하는 선언적 제약이 많을수록 사람들이 미래에 코드를 읽고 구문 분석하고 이해하는 것이 더 쉽고 빠릅니다.물론
const
선언보다 선언에 더 많은 규칙이 있습니다var
. 블록 범위, TDZ, 선언시 할당, 재 할당 없음. 반면var
명령문은 함수 범위 만 신호합니다. 그러나 규칙 계산은 많은 통찰력을 제공하지 않습니다. 복잡성 측면에서 이러한 규칙을 평가하는 것이 좋습니다. 규칙이 복잡성을 더하거나 뺍니까? 의 경우const
블록 범위 지정은 함수 범위보다 좁은 범위를 의미하고 TDZ는 선언 전에 사용을 파악하기 위해 선언에서 범위를 뒤로 스캔 할 필요가 없으며 할당 규칙은 바인딩이 항상 동일한 참조.제한적인 문장 일수록 코드가 단순 해집니다. 명령문의 의미에 제약을 추가하면 코드를 예측하기가 더 어려워집니다. 이것이 정적 유형 프로그램이 일반적으로 동적 유형 프로그램보다 읽기 쉬운 가장 큰 이유 중 하나입니다. 정적 타이핑은 프로그램 작성기에 큰 제약을 가하지 만 프로그램을 해석하는 방법에 큰 제약을 가해 코드를 이해하기 쉽게 만듭니다.
이러한 주장을 염두에두고
const
생각할 가능성이 가장 적은 문장이므로 가능한 한 사용 하는 것이 좋습니다 .