ES6- 순환 중인 블록 레벨 역할 영역

15779 단어 ES6

for 순환

let
// 
var funcs = [];
for (var i = 0; i < 3; i++) {
    funcs[i] = function () {
        console.log(i);
    };
}
funcs[0](); // 3
//   
var funcs = [];
for (var i = 0; i < 3; i++) {
    funcs[i] = (function(value){
        return function() {
            console.log(value);
        }
    }(i))
}
funcs[0](); // 0

순환 내부에서 함수를 즉시 실행하여 수락된 모든 변수 i에 복사본을 만들고 변수value로 저장합니다
// ES6 let   (  1)
var funcs = [];
for (let i = 0; i < 3; i++) {
    funcs[i] = function () {
        console.log(i);
    };
}
funcs[0](); // 0

여기서 let이 클립을 해결하는 이유는 무엇일까요?
우리가 알고 있는 let , , , 그런데 왜 여기서 i값을 정확하게 출력할 수 있습니까?
어떤 사람들은 for 순환에서 순환 변수를 설정하는 부분은 하나의 단독 작용역이라고 추측한다.
우리 잠시 위의 문제를 놓아 봅시다~~
먼저 다른 밤을 보고 추측이 정확한지 봅시다.
for (let i = 0; i < 3; i++) {
  let i = 'ES6';
  console.log(i);
}
// ES6
// ES6
// ES6

우리 var 성명의 변수를 다시 한 번 시험해 봅시다
for (var i = 0; i < 3; i++) {
  var i = 'ES6';
  console.log(i);
}
// ES6  

왜 결과가 달라졌을까, 단독 작용역이 있다면 결과는 같을 텐데...
*주의: let , 반드시 let의 향상되지 않은 특성과 관련이 있는 것은 아니다.
for 순환에서 let과 var를 사용하면 밑바닥은 서로 다른 처리 방식을 사용합니다.
사실은 위의 코드가 이렇게 해석한 것이다. 바로 for(let i=0;i<3;i++)에서 원괄호 안에 숨겨진 작용역을 만드는 것이다.
통속적으로 말하자면 ~~순환할 때마다let은 새로운 변수 i를 만들고 이를 i의 현재 값으로 초기화합니다.
밤 1의 코드는 다음과 같다.
//  
(let i = 0) {
    funcs[0] = function() {
        console.log(i)
    };
}

(let i = 1) {
    funcs[1] = function() {
        console.log(i)
    };
}

(let i = 2) {
    funcs[2] = function() {
        console.log(i)
    };
};
let i=6;
for(let i=0;i<3;i++)
{
	let i;
	console.log(i);  //undefied undefied undefied 
	// {}   () 
}
const 그럼 위에 있는 let을 const로 바꿀까요?
var funcs = [];
for (const i = 0; i < 10; i++) {
    funcs[i] = function () {
        console.log(i);
    };
}
funcs[0](); //    const 
    

for in


우리가 위에서 말한 것은 모두 일반적인 for 순환이다. 그러면 for in 순환에서는?
var funcs = [], object = {a: 1, b: 1, c: 1};
for (var key in object) {
    funcs.push(function(){
        console.log(key)
    });
}

funcs[0]() 


var로 출력 결과'c'
let으로 성명하면 결과는'a'입니다.
콘스트는요?오류가 발생하지 않았습니다. 출력 결과는'a'입니다. for in 순환에서 매번 교체할 때마다 기존의 귀속을 수정하지 않고 새로운 귀속을 만들 수 있기 때문입니다.
const의 특징은 블록 레벨 역할 영역에서 반복적으로 설명할 수 없고 값을 다시 부여할 수 없다는 것이다. (중점은 블록 레벨 역할 영역이다.)for in의 매번 순환은 새로운 블록급 작용역이기 때문에 for (const a in b) 형식으로 대상을 훑어볼 수 있습니다.

좋은 웹페이지 즐겨찾기