es6 블록 급 작용 역 의 사용 을 깊이 이해 하 다
8656 단어 es6블록 급 역할 영역
자 바스 크 립 트 에서 var 를 사용 하여 변 수 를 정의 합 니 다.전역 작용 역 함수 함수 의 국부 작용 역 을 정의 하 든 그 작용 역 의 맨 위로 향 상 됩 니 다.이것 도 자 바스 크 립 트 정의 변수의 곤 혹 스 러 운 부분 입 니 다.es5 는 다른 종류의 C 언어 와 같은 블록 급 역할 영역 이 없 기 때문에 es6 는 let 정의 변 수 를 추가 하여 블록 급 역할 영역 을 만 들 었 습 니 다.
var 정의 변수의 예 시 를 살 펴 보 겠 습 니 다.
function setName(){
if(condition){
var name = 'loho';
console.log(name);
}else{
console.log(name);
}
}
var student = 'eveningwater';
setName();
상기 코드 는 다음 과 같이 이해 할 수 있 습 니 다.
var student;
function setName(){
var name;
if(condition){
name = 'loho';
console.log(name);//loho
}else{
console.log(name);//undefined
}
}
student = 'eveningwater';
setName();
블록 급 성명블록 급 성명 은 블록 급 역할 영역 을 지정 하여 블록 급 역할 영역 에서 정의 하 는 변 수 를 더 이상 전역 적 으로 접근 할 수 없 게 하고 블록 급 역할 영역 도 품사 역할 영역 이 라 고 부 릅 니 다.
블록 급 역할 영역 은 두 곳 에 존재 합 니 다:
let 성명 은 var 성명 용법 과 일치 합 니 다.유일한 차이 점 은 let 성명 이 변 수 를 한 블록 에 제한 하면 블록 급 역할 영역 이 형성 되 기 때문에 변수의 향상 도 존재 하지 않 습 니 다.
예 를 들 어 앞의 예 시 를 우 리 는 다음 과 같이 쓸 수 있다.
let stundent = 'eveningwater';
function setName(){
if(condition){
let name = 'loho';
console.log(name);//loho
}else{
// false
console.log(name);//
}
}
setName();
2.재 성명 금지let 정의 변 수 를 사용 하기 전에 같은 변 수 를 설명 하면 오류 가 발생 합 니 다.따라서 변 수 를 반복 할 수 없습니다.다음 예제 와 같다.
var name = 'eveningwater';
// ,
let name = 'loho';
물론 이 두 변 수 는 같은 역할 영역 에 있어 야 하 며,서로 다른 역할 영역 에 있다 면 잘못 보고 하지 않 을 것 이다.그러나 첫 번 째 성명 의 변 수 를 가 릴 수 있다.다음 예제 와 같다.
var name = 'eveningwater';
if(condition){
//
let name = 'loho';
}
3.const 성명const 식별 자 를 사용 하여 설명 한 변 수 는 초기 화 되 어야 하기 때문에 이 성명 은 상수 입 니 다.다음 예:
const name='eveningwater';//
const name;// ,
const 성명 은 let 성명 과 마찬가지 로 블록 급 역할 도 메 인 을 만 들 었 습 니 다.이 블록 급 역할 도 메 인 외 에 설명 한 변 수 를 방문 할 수 없습니다.다시 말 하면 const 가 설명 한 변 수 는 변수 향상 메커니즘 이 없 을 것 이다.다음 예:
if(condition){
const name = 'eveningwater';
console.log(name);//'eveningwater'
}
//
console.log(name);
같은 const 도 중복 성명 할 수 없습니다.다음 과 같 습 니 다.
var name = 'eveningwater';
// ,
const name = 'loho';
그러나 서로 다른 역할 영역 에서 반복 적 으로 성명 할 수도 있 습 니 다.다음 과 같 습 니 다.
var name = 'eveningwater';
if(condition){
const name = 'loho';
console.log(name);//loho,
}
비록 const 성명 과 let 성명 이 너무 비슷 한 부분 이 많 지만 const 성명 도 let 성명 과 다른 점 이 있 습 니 다.바로 const 성명 의 변 수 는 할당 되 지 않 습 니 다.엄격 하지 않 은 모드 에서 든 엄격 한 모드 에서 든 const 성명 의 변 수 를 할당 할 수 없습니다.다음 예:
const name = 'eveningwater';
//
name = 'loho';
단,대상 을 정의 하면 대상 의 값 을 수정 할 수 있 습 니 다.다음 과 같 습 니 다.
const student = {
name:'eveningwater'
}
student.name = 'loho';//
// ,
student = {
name:'loho'
}
4.임시 사각 지대앞에서 언급 한 let 와 const 성명 의 변 수 는 역할 필드 의 맨 위 에 올 라 가지 않 기 때문에 이 두 개의 식별 자 성명 을 사용 하기 전에 방문 하면 오류 가 발생 할 수 있 습 니 다.type:of 연산 자 라 도 인용 오류 가 발생 할 수 있 습 니 다.다음 예:
console.log(typeof name);//
const name = 'eveningwater';
첫 번 째 줄 코드 가 잘못 되 었 기 때문에 후속 성명 변수 문 구 는 실행 되 지 않 습 니 다.이때 자 바스 크 립 트 커 뮤 니 티 의 이른바'임시 사구'(temporal dead zone)가 나 타 났 습 니 다.예 를 들 어 const 성명 이지 만 let 성명 도 마찬가지 입 니 다.그러나 const 나 let 에서 설명 한 변수의 역할 영역 외 에 type:of 연산 자 를 사용 하여 감 측 하면 오류 가 발생 하지 않 고 undefined 로 돌아 갈 뿐 입 니 다.다음 예:
console.log(typeof name);//undefined
if(condition){
let name = 'eveningwater';
}
5.순환 중인 블록 급 역할 영역 바 인 딩우 리 는 var 성명 변 수 를 사용 할 때 항상 이런 상황 을 만 납 니 다.다음 과 같 습 니 다.
for(var i = 0;i < 100;i++){
//
}
// i
console.log(i);//100
우 리 는 let 성명 을 사용 하여 변 수 를 순환 으로 제한 할 수 있 습 니 다.이때 순환 작용 영역 밖에서 변 수 를 방문 하면 i 가 잘못 보 고 됩 니 다.let 성명 은 순환 을 위해 블록 급 역할 영역 을 만 들 었 기 때 문 입 니 다.다음 과 같다.
for(let i = 0;i < 100;i++){
//
}
//
console.log(i);
6.순환 중인 생 성 함수var 성명 변 수 를 사용 하 는 순환 에서 함 수 를 만 드 는 것 은 매우 어렵 습 니 다.다음 과 같 습 니 다.
var func = [];
for(var i = 0;i < 5;i++){
func.push(function(){
console.log(i);
})
}
func.forEach(function(func){
func();
});
0 에서 5 사이,즉 0,1,2,3,4 의 숫자 를 인쇄 하 는 것 이 라 고 예상 할 수 있 지만 정 답 은 그렇지 않다.함수 가 자신의 역할 영역 이 있 기 때문에 배열 에 함 수 를 추가 할 때 실제 순환 이 완료 되 었 기 때문에 인쇄 변수 i 의 값 은 전체 에서 변수 i 를 방문 하 는 값,즉 i=5 라 는 값 에 해당 하기 때문에 실제 답 은 최종 적 으로 5 번 으로 돌아 갑 니 다.es5 에서 우 리 는 함수 표현 식(IIFE)을 사용 하여 이 문 제 를 해결 할 수 있 습 니 다.함수 표현 식 은 자신의 블록 급 역할 도 메 인 을 만 들 기 때 문 입 니 다.다음 과 같다.
var func = [];
for(var i = 0;i < 5;i++){
(function(i){
func.push(function(){
console.log(i);
})
})(i)
}
func.forEach(function(func){
func();// , 0,1,2,3,4
});
그러나 사실은 es6 의 let 성명 이 있 습 니 다.우 리 는 이렇게 귀 찮 을 필요 가 없습니다.var 를 let 성명 으로 바 꾸 면 됩 니 다.다음 과 같 습 니 다.
var func = [];
for(let i = 0;i < 5;i++){
func.push(function(){
console.log(i);
})
}
func.forEach(function(func){
func();// 0,1,2,3,4
})
그러나 여기 서 const 성명 을 사용 할 수 없습니다.앞에서 언급 한 바 와 같이 const 성명 은 상수 로 초기 화 된 후에 수정 할 수 없고 대상 에서 만 값 을 수정 할 수 있 습 니 다.다음 예제 와 같이 잘못 보고 할 것 이다.
// i++
for(const i = 0;i < len;i++){
console.log(i);
}
i++이 문 구 는 상수 i 의 값 을 수정 하려 고 시도 하기 때문에 const 성명 을 for 순환 에 사용 할 수 는 없 지만,const 성명 을 for-in 이나 for-of 순환 에 사용 할 수 있 습 니 다.다음 과 같다.
var func = [];
var obj = {
name:'eveningwater',
age:22
}
for(let key in obj){
func.push(function(){
console.log(key)
})
}
func.forEach(function(func){
func();//name,age
});
//
var func = [];
var obj = {
name:'eveningwater',
age:22
}
for(const key in obj){
func.push(function(){
console.log(key)
})
}
func.forEach(function(func){
func();//name,age
});
키 의 값 을 수정 하지 않 았 기 때문에 const 와 let 성명 을 사용 해도 됩 니 다.for-of 순환 도 마찬가지 입 니 다.for-of 순환 은 es6 의 새로 추 가 된 나 쁜 것 이다.7.전역 역할 영역 바 인 딩
let,const 성명 과 var 성명 의 또 다른 차이 점 은 세 사람 이 전체 역할 영역 에서 의 행위 이다.var 를 사용 하여 변 수 를 설명 할 때 전역 역할 영역(일반적으로 브 라 우 저 window 대상)에서 전역 속성 을 만 듭 니 다.이것 은 window 대상 에 존재 하 는 전역 변 수 를 덮어 쓸 수 있 음 을 의미 합 니 다.다음 예:
console.log(window.Array);// , f Array(){}
var Array = ' ';
console.log(window.Array);// ' ';
위의 예 를 들 어 전역 역할 영역 에서 Array 변 수 를 정의 하거나 Array 속성 이 존재 하 더 라 도 나중에 정의 한 Array 변 수 는 이전에 정 의 된 Array 변수(속성)를 덮어 씁 니 다.그러나 es6 의 let 와 const 성명 은 이러한 상황 이 발생 하지 않 습 니 다.let 와 const 성명 은 새로운 바 인 딩 을 만 듭 니 다.즉,window 대상 의 속성 이 되 지 않 습 니 다.설명 한 변 수 는 전역 변 수 를 덮어 쓰 지 않 고 가 려 진 다 는 것 이다.다음 예:
let Array = ' ';
console.log(Array);//' ‘;
console.log(window.Array);// , f Array(){}
그 러 니까 window.Array!==Array 이 등식 은 불 값 true 를 되 돌려 줍 니 다.8.블록 급 귀속 의 최 적 실천
es6 블록 급 성명 변 수 를 사용 할 때 가장 좋 은 실천 은 이 변수의 값 을 나중에 바 꾸 지 않 을 것 이 라 고 확정 하면 const 로 설명 하고 이 변수의 값 을 바 꾸 려 면 let 로 설명 하 는 것 입 니 다.예상 치 못 한 변수 값 이 바 뀌 었 을 때 많은 bug 가 나타 나 는 원본 이기 때 문 입 니 다.다음 예제:
function eveningWater(){};
eveningWater.prototype.name = 'eveningwater';
let ew = new eveningWater();
// ,
const _constructor = ew.constructor;
//
let name = ew.name;
if(_constructor === eveningWater || _constuctor === Object){
console.log(_constructor);
}else{
name = 'loho';
console.log(name)
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.