ES6 입문 강좌 의 let,const 사용 방법
ES5 에서 전역 작용 역 과 함수 작용 역 만 있 고 블록 급 작용 역 이 없어 서 가 져 온 불합리한 장면 을 해결한다.
let
기본 용법
용법 은 var 와 마찬가지 로 let 성명 의 변 수 는 let 명령 이 있 는 코드 블록 에서 만 유효 합 니 다.
{
let a = 10;
var b = 1;
}
a // ReferenceError: a is not defined.
b // 1
var 성명 의 변 수 는 코드 블록 외 에 도 호출 할 수 있 고 let 성명 의 변 수 는 호출 오류 임 을 알 수 있 습 니 다.그래서 let 성명 은 현재 코드 블록 에서 만 호출 할 수 있 습 니 다.변수 향상
var 를 사용 할 때'변수 향상'현상 이 나타 납 니 다.즉,변 수 는 성명 하기 전에 사용 할 수 있 고 값 은 undefined 입 니 다.let 는 이러한 상황 을 바 꾸 었 으 나,먼저 사용 을 성명 해 야 하 며,성명 전에 사용 하면 오류 가 발생 할 수 있 습 니 다.다음 과 같다.
// var
console.log(foo); // undefined
var foo = 2;
// let
console.log(bar); // ReferenceError
let bar = 2;
일시 적 사구블록 급 역할 영역 내부 에 let 또는 const 명령 이 존재 하면 설명 한 변 수 는 이 영역 에 연결 되 어 외부 영향 을 받 지 않 습 니 다.또한 일시적인 사각 지대 의 본질은 현재 역할 영역 에 들 어가 면 사용 할 변 수 는 이미 존재 하지만 가 져 올 수 없습니다.변 수 를 설명 하 는 줄 코드 가 나타 날 때 까지 기 다 려 야 이 변 수 를 가 져 오고 사용 할 수 있 습 니 다.다음 과 같다.
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
ES6 는 블록 에 let 와 const 명령 이 존재 하면 이 블록 이 이 명령 성명 에 대한 변 수 는 처음부터 폐쇄 적 인 역할 영역 을 형성 하도록 명 확 히 규정 하고 있다.성명 하기 전에 이 변 수 를 사용 하면 잘못 보고 할 수 있다.한 마디 로 하면 코드 블록 에서 let 명령 으로 변 수 를 설명 하기 전에 이 변 수 는 사용 할 수 없습니다.이 는 문법 적 으로'일시 적 사구'(temporal dead zone·TDZ 로 약칭)라 고 한다.다음 과 같다.
if (true) {
// TDZ
tmp = 'abc'; // ReferenceError
console.log(tmp); // ReferenceError
let tmp; // TDZ
console.log(tmp); // undefined
tmp = 123;
console.log(tmp); // 123
}
주의:+let 성명 변 수 를 사용 할 때 변수 가 성명 이 완료 되 기 전에 사용 하면 오류 가 발생 합 니 다.위 에 있 는 이 줄 은 이 상황 에 속 합 니 다.변수 x 의 성명 문 이 실행 되 기 전에 x 의 값 을 가 져 와 서'x 가 정의 되 지 않 았 습 니 다.'+
중복 성명 허용 하지 않 음
let 는 같은 역할 영역 에서 같은 변 수 를 설명 하 는 것 을 허용 하지 않 습 니 다.다음 과 같 습 니 다.
//
function func() {
let a = 10;
var a = 1;
}
//
function func() {
let a = 10;
let a = 1;
}
또는 다음 과 같 습 니 다.
function func(arg) {
let arg;
}
func() //
function func(arg) {
{
let arg;
}
}
func() //
블록 급 역할 영역위 에서 도 언급 한 바 와 같이 es5 에서 블록 급 작용 역 이 없다 는 개념 은 함수 작용 역 과 전역 작용 역 만 있 기 때문에 몇 가지 문 제 를 가 져 왔 다.다음 과 같다.
var tmp = new Date();
function f() {
console.log(tmp);
if (false) {
var tmp = 'hello world';
}
}
f(); // undefined
, , undefinded
두 번 째:전체 유출 을 계산 합 니 다.다음 과 같 습 니 다.
var s = 'hello';
for (var i = 0; i < s.length; i++) {
console.log(s[i]);
}
console.log(i); // 5
, 1 2 3 4 5 5
ES6 의 블록 급 역할 영역 은 실제 let 에서 새로 추 가 된 것 입 니 다.다음 과 같 습 니 다.
function f1() {
let n = 5;
if (true) {
let n = 10;
}
console.log(n); // 5
}
n
ES6 에 서 는 역할 영역 을 임의로 끼 워 넣 을 수 있 고 서로 간섭 하지 않 습 니 다.다음 과 같 습 니 다.
{{{{
let insane = 'Hello World';
{let insane = 'Hello World'}
}}}};
{{{{
{let insane = 'Hello World'}
console.log(insane); //
}}}};
블록 급 역할 필드 의 등장 은 다음 과 같은 함수 의 쓰기 가 필요 하지 않 습 니 다.다음 과 같 습 니 다.
// IIFE
(function () {
var tmp = ...;
...
}());
//
{
let tmp = ...;
...
}
블록 급 역할 영역 과 함수 설명ES5 에서 함 수 는 최상 위 역할 영역 과 함수 역할 영역 에서 만 설명 할 수 있 고 블록 급 역할 영역 에서 설명 할 수 없습니다.그러나 브 라 우 저 는 호환성 을 위해 블록 급 역할 영역 에서 설명 할 수 있 습 니 다.이론 적 으로 ES6 에서 블록 급 역할 영역 에서 설명 하 는 함 수 는 외부 호출 에서 오 류 를 보고 하고 환경의 문 제 를 고려 하여 블록 급 역할 영역 에서 함 수 를 설명 하 는 것 을 피해 야 합 니 다.필요 하 다 면 함수 성명 문 대신 함수 표현 식 으로 써 야 합 니 다.다음 과 같 습 니 다.
//
{
let a = 'secret';
function f() {
return a;
}
}
//
{
let a = 'secret';
let f = function () {
return a;
};
}
constconst 가 설명 한 것 은 상수 입 니 다.다음 과 같 습 니 다.
const PI = 3.1415;
PI // 3.1415
PI = 3;
// TypeError: Assignment to constant variable.
성명 후 할당 하면 오 류 를 보고 할 수 있 습 니 다.또한 성명 은 상수 이기 때 문 입 니 다.즉,const 성명 후 할당 해 야 합 니 다.그렇지 않 으 면 오 류 를 보고 할 수 있 습 니 다.const 는 let 와 마찬가지 로 성명 도 현재 블록 급 역할 영역 에서 만 유효 합 니 다.마찬가지 로 향상 을 성명 하지 않 고 일시 적 인 사각 지대 도 존재 합 니 다.성명 후에 만 사용 할 수 있 고 let 와 마찬가지 로 중복 성명 을 할 수 없 으 며 다시 할당 할 수 없습니다.
중요:
const 가 변경 할 수 없 는 것 은 값 이 아니 라 변수 가 가리 키 는 메모리 주소 에 저 장 된 값 은 변경 할 수 없습니다.간단 한 형식(수치,문자열,불 값)에 대해 서 는 변수 가 가리 키 는 메모리 주소 에 저 장 됩 니 다.따라서 상수 와 같 습 니 다.한편,복합 형식(배열,대상)에 대해 변수 가 가리 키 는 메모리 주 소 는 실제 데 이 터 를 가리 키 는 지침 일 뿐 const 는 이 지침 이 고정 되 어 있 음 을 보증 할 수 밖 에 없다(즉,항상 고정된 주 소 를 가리 키 는 것).그것 이 가리 키 는 데이터 구 조 는 제어 할 수 없다.다음 과 같다.
const foo = {};
// foo ,
foo.prop = 123;
foo.prop // 123
// foo ,
foo = {}; // TypeError: "foo" is read-only
foo , 。 ,
foo , , 。
혹은
const a = [];
a.push('Hello'); //
a.length = 0; //
a = ['Dave']; //
a , , a,
만약 정말로 성명 대상 을 동결 하고 싶다 면,변경 할 수 없 으 면 사용 해 야 한다object.freeze()
const foo = Object.freeze({});
// , ;
// ,
foo.prop = 123;
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key, i) => {
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};
ES6 변수 설명 6 가지 방법1. function
2. var
3. let
4. const
5. import
6. class
최상 위 개체 의 속성
브 라 우 저 환경 에 서 는 window 대상 을 말 하 며,Node 에 서 는 global 대상 을 말 하 며,ES5 에 서 는 최상 위 대상 의 속성 과 전역 변 수 는 등가 입 니 다.
window.a = 1;
a // 1
a = 2;
window.a // 2
글로벌 대상ES5 의 최상 위 대상 자체 도 문제 다.여러 가지 실현 에서 통일 되 지 않 기 때문이다.
new Function('return this')()
항상 전체 대상 으로 돌아간다.단,브 라 우 저가 CSP(Content Security Policy,콘 텐 츠 보안 정책)를 사용 했다 면 eval,new Function 같은 방법 을 사용 할 수 없 을 수도 있 습 니 다.이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JavaScript로 카드 놀이를 넘기는 애니메이션을 만들려고했습니다.카드를 넘기는 애니메이션을 만들어 보았습니다. 폴더 구성은 다음과 같습니다. 코드는 다음과 같습니다. card_turning.html 다음은 JavaScript 코드입니다. cardTurning.js 결과는, 이런 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.