<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var funcs = [];
// let's create 3 functions
for (var i = 0; i < 3; i++) {
// and store them in funcs
funcs[i] = function() {
// each should log its value.
console.log("My value: " + i);
};
}
for (var j = 0; j < 3; j++) {
// and now let's run each one to see
funcs[j]();
}
끝 - < 스니핏 >;!
It 출력입니다 이:
>. 나의 가치: 3 나의 가치: 3 나의 가치: 3
반면 정보기술 (it) 등 i&; d # 39 를 출력: >. 나의 가치: 0 나의 가치: 1 나의 가치: 2
같은 지연으로 인한 이벤트 리스너를 사용하여 실행하는 기능이 문제가 발생합니다.
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var buttons = document.getElementsByTagName("button");
// let's create 3 functions
for (var i = 0; i < buttons.length; i++) {
// as event listeners
buttons[i].addEventListener("click", function() {
// each should log its value.
console.log("My value: " + i);
});
}
<button>0</button>
<br />
<button>1</button>
<br />
<button>2</button>
끝 - < 스니핏 >;!
사실 또는 비동기적입니다 코드를 사용하여. (예::
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
5 651 {{{000}}}
끝 - < 스니핏 >;!
이러한 기본 문제 해결 방안은 무엇일까요?
뭐, 문제는 너회의 익명 함수 내에서 각 변수 'i', 바인딩됩니다 위부의 같은 변수 함수.
각각의 기능을 해야 할 것은 그리웠댔지 바인딩해야 가변으로 변하지 않는 가치를 별도의 외부 함수.
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var funcs = [];
function createfunc(i) {
return function() {
console.log("My value: " + i);
};
}
for (var i = 0; i < 3; i++) {
funcs[i] = createfunc(i);
}
for (var j = 0; j < 3; j++) {
// and now let's run each one to see
funcs[j]();
}
끝 - < 스니핏 >;!
단 기능이 없기 때문에 블록 유효범위 JavaScript 에 의해 함수 생성 함수 확인하십시오 랩할 유효범위 - 새로운 가치를 i" "; 의도한 남아 있다.
< hr>;
상대적으로 넓게퍼진 가용성입니다 아리스프로토티페스포리치 '기능이 있는' (2015년) 의 가치가 있는 것은 이러한 경우에는 주로 it& # 39 값뿐만 스포리치 () '는' 등을 통해 이터레이션에 배열입니다 청소하십시오 확실한 방법은 모든 이터레이션에 폐쇄, 자연. 즉, 일종의 어레이입니다 값이 포함된 것으로 you& # 39, ve got (DOM 참조입니다 오브젝트에도 있는모든) 와 관련된 문제가 발생하면 각 요소 설정 콜백, 이 작업을 수행할 수 있습니다.
var someArray = [ /* whatever */ ];
// ...
someArray.forEach(function(arrayElement) {
// ... code code code for this one element
someAsynchronousFunction(arrayElement, function() {
arrayElement.doSomething();
});
});
이 아이디어는 콜백 함수 호출 함께 사용할 수 있는 '각' 스포리치 루프는 자체 폐쇄. 매개변수 (parameter) 는 특정 단계를 통과한 해당 처리기에서 배열 요소의 해당 이터레이션은. # 39 it& 사용되는 경우, s, t # 39 콜백하는 비동기 콜백 won& 충돌하고, 이 단계를 확립했습니다 기타 다른 곳에서도 이터레이션은.
Jquery 의 '$ 그레이크 () 이 발생할 경우 일해야 하고,' 기능이 비슷한 기능을 제공합니다.
< hr>;
6 자 '와' 상수 '새' (ES6) 는 ecma 스크립트 범위지정 키워드는 '다르게' 기반의 변수 var. 예를 들어, 루프 (loop) 를 기반으로 한 'let' 는 전혀 새로운 가치를 통해 각 이터레이션에 인덱스화하여 'i' 는 루프 내에 있는 각 값마다 범위지정 도왔으매 코드에 예상대로 협력할 것이라고 말했다. 하지만 여러 가지 리소스에는 i&; d # 39 추천합니까 [2ality& # 39 의 블록 범위 지정 게시물로의] (http://www.2ality.com/2015/02/es6-scoping.html) 를 멋지구리해요 정보 출처.
for (let i = 0; i < 3; i++) {
funcs[i] = function() {
console.log("My value: " + i);
};
}
두려워 할 수 있지만, 그 전에 IE9-IE11 및 모서리까지 면쪽 14 위에 내려받습니다 지원부에서는 'let' 하지만 잘못된 (그 don& # 39, t 새로 만드는 'i' 때마다, 따라서 모든 기능을 할 때와 같은 3 위 로깅합니다 칼리오피 우린 'var'). 결국 이 네 모서리 14 된다.
종료기:
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = (function(index) {
return function() {
console.log("My value: " + index);
};
}(i));
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
끝 - < 스니핏 >;!
개인적으로 저는 @Aust& # 39 의 [오토메이티드 콜빈드 사용에 대한 더 최근의 ''] (https://stackoverflow.com/a/19323214/918959) 는 이 같은 일을 할 수 있는 최선의 방법은 이제. # 39, # 39 의 's 도 there& lo-dash/underscore& _.partial' t need don& 때, 또는 '& # 39 엉망하지 정렬할지 # 39 을 (를)', 's' 바인딩해야 티사리.
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var funcs = {};
for (var i = 0; i < 3; i++) {
funcs[i] = function(x) {
console.log('My value: ' + x);
}.bind(this, i);
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
끝 - < 스니핏 >;!
지적한 대로 @squint 및 @mekdev 확보하십시오 만들어 기능을 통해 더 나은 성능을 위부의 루프 내에 결과를 먼저 그리곤요 바인딩하면 루프지
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
function log(x) {
console.log('My value: ' + x);
}
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = log.bind(this, i);
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
끝 - < 스니핏 >;!
[Ui_policytable_java_spe_policy 즉시 호출되었을 함수은 표현식에서는] 사용하여 (http://en.wikipedia.org/wiki/Immediately-invoked_function_expression), 가장 간단하고 가장 판독값 둘러싸려면 운행에서어떠한 색인 변수:
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
for (var i = 0; i < 3; i++) {
(function(index) {
console.log('iterator: ' + index);
//now you can also loop an ajax call here
//without losing track of the iterator value: $.ajax({});
})(i);
}
끝 - < 스니핏 >;!
우리는 formula_26 이 report. 반복자가 'i' 를 '' 익명 함수 재배케하여 인덱스화할 있다. 이렇게 하면 나중에 사용할 수 있는 'i' 가 폐쇄 가변적입니다 구했잖아 비동기적입니다 기능을 믿지아니하며 내 인생.
하지만 제가 좀 늦게 자, 오늘 그리고 있다는 사실을 알고 이 문제에 대한 답을 don& 탐험이요 많은 문제들을 어떻게, 어떤 이는 t # 39 이 문제는 본질적으로 완전히 Javascript 에서는 범위, 아래로.
따라서, 많은 다른 문제는 내부 함수은 참조하는 것 같은 'i' 변수. 그렇다면 왜 우리는 그냥 don& # 39, t 각 이터레이션에 로컬 변수 함수 참조 대신 새로운 것을 만들 수 있고, 안쪽?
<! - begin 스니핏: js 숨기십시오: > 거짓값 -;
//overwrite console.log() so you can see the console output
console.log = function(msg) {document.body.innerHTML += '<p>' + msg + '</p>';};
var funcs = {};
for (var i = 0; i < 3; i++) {
var ilocal = i; //create a new local variable
funcs[i] = function() {
console.log("My value: " + ilocal); //each should reference its own local variable
};
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
끝 - < 스니핏 >;!
마찬가지로, 여기서 각 내부 함수 출력 전에 마지막 대입된 값이 'i', '이제 그냥 출력입니다 각 내부 함수은 마지막 대입된 값이 일로커'. 하지만, s, t 각 이터레이션에 %s/dbase/ext_table. shouldn& # 39 it& # 39 İç 일로커 '?'
알고보니 that& # 39 의 문제. 이제 막 첫 번째 이후 각 이터레이션은 같은 유효범위 도왔으매 모든 이터레이션에 일로커 덮어쓰기는 '공유'. [매든] 에서 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/block # No_block_scope):
>. 중요: JavaScript 없는 내시경이요 블록 변수, 함수 또는 스크립트에만 도입된 범위지정 redboot*용 효과와 설정할 수 있는 블록을 그 이상으로 옛일에 블록 있다. 즉, a 블록 명령문입니다 소개하십시오 내시경이요 마십시오. 비록 " standalone"; 블록은 블록 유효함 구문을 사용하지 않는 경우, 독립, t do what you think 닫히더라도 don& # 39 JavaScript 있기 때문에 그렇게 생각한다면 그들이 행하는모든 이런걸 블록 등 C 또는 jave.
이를 강조하기 위해 거듭 강조했습니다.
그 전에 먼저 각 이터레이션에 너희가운데 '이' 일로커 선택하여 볼 수 있습니다.
<! - begin 스니핏: js 숨기십시오: > 거짓값 -;
//overwrite console.log() so you can see the console output
console.log = function(msg) {document.body.innerHTML += '<p>' + msg + '</p>';};
var funcs = {};
for (var i = 0; i < 3; i++) {
console.log(ilocal);
var ilocal = i;
}
끝 - < 스니핏 >;!
이래서 이 버그는 너무 까다로운. # 39 는 변수, 자바스크립트 won& 레데클링 경우라도, t, t # 39 는 경고야 던져 버리는 오류를 및 이슬린트 won& 한다. 이 문제를 해결할 수 있는 것도 이 폐쇄된 것은 본질적으로 활용할 수 있는 가장 좋은 방법은 있다는 생각에, 내부 기능을 Javascript 에서 내부 범위 때문에 외부 변수를 액세스하도록 " enclose"; 외부 범위.
! 클로저
또한, 내부 기능을 갖고 있는 이 " onto"; 외부 변수와 그들을 지킬 수 있어도, 외부 함수는 살아. 우리는 이 함수를 호출할 수 있도록 활용할 수 있게 만들고, 래퍼, '순수' 의 새 유효범위 너희가운데 일로커 복귀하십시오 새로운 범위 및 내부 함수를 사용하는 '일로커' (아래 설명 더):
<! - begin 스니핏: js 숨기십시오: > 거짓값 -;
//overwrite console.log() so you can see the console output
console.log = function(msg) {document.body.innerHTML += '<p>' + msg + '</p>';};
var funcs = {};
for (var i = 0; i < 3; i++) {
funcs[i] = (function() { //create a new scope using a wrapper function
var ilocal = i; //capture i into a local var
return function() { //return the inner function
console.log("My value: " + ilocal);
};
})(); //remember to run the wrapper function
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
끝 - < 스니핏 >;!
함수 안에서 함수를 얻을 수 있는 환경을 만드는 내부 it 는 래퍼 함수은 내부 전용 디렉토리에만 액세스하려면 closure" ";). 따라서 우리는 우리가 만든 함수를 사용할 때마다 security. 래퍼 it& # 39 의 새 내부 환경 보장 ',' t # 39, 별도의 일로커 com/go/4e6b330a_kr don& 서로 충돌하는 및 덮어쓰시겠습니까. 다른 많은 대답할 수 있도록 마지막 몇 경미함 최적화 제공했음:
<! - begin 스니핏: js 숨기십시오: > 거짓값 -;
//overwrite console.log() so you can see the console output
console.log = function(msg) {document.body.innerHTML += '<p>' + msg + '</p>';};
var funcs = {};
for (var i = 0; i < 3; i++) {
funcs[i] = wrapper(i);
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
//creates a separate environment for the inner function
function wrapper(ilocal) {
return function() { //return the inner function
console.log("My value: " + ilocal);
};
}
끝 - < 스니핏 >;!
이제 우리는 새로운 'let' 키워드를 가지고 있는 ES6 com/go/4e6b330a_kr 블록 범위지정 만드는 데 사용할 수 있습니다.
<! - begin 스니핏: js 숨기십시오: > 거짓값 -;
//overwrite console.log() so you can see the console output
console.log = function(msg) {document.body.innerHTML += '<p>' + msg + '</p>';};
var funcs = {};
for (let i = 0; i < 3; i++) { // use "let" to declare "i"
funcs[i] = function() {
console.log("My value: " + i); //each should reference its own local variable
};
}
for (var j = 0; j < 3; j++) { // we can use "var" here without issue
funcs[j]();
}
끝 - < 스니핏 >;!
얼마나 쉽게 포착하십시오 지금이예요! 자세한 내용은 [이 오토메이티드] (https://stackoverflow.com/a/16661498/1852456) 를 내 정보 기반하지 않고 있다.
지금 ES6 함께 가장 널리 지원되는 이 질문의 답을 변경되었습니까. Let '와' 상수 '는' es6 여러_키워드 엔드입니다 정확한 상황을. 대신 사용할 수 있고, 그냥 'let' 클로저 메싱 수립하였습니다 루프 변수 범위를 설정할 수 있는 다음과 같습니다.
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var funcs = [];
for (let i = 0; i < 3; i++) {
funcs[i] = function() {
console.log("My value: " + i);
};
}
끝 - < 스니핏 >;!
그러면 해당 객체를 가리키십시오 '발' 와 관련된 선반가공 루프의 반환되므로 폐쇄 및 추가 없이 정확한 값을 말한다. 이 것은 이 문제를 획기적으로 간편하게.
'상수' 는 비슷한 't be can& # 39 의 추가적인 변수 이름을 바꿔야 한다고 하자, 경기 후 새 참조입니다 초기 할당에서는.
여기에 최신 버전의 브라우저를 브라우저 지원은 이제 그 대상으로. '상수' / '파이어폭스, 사파리, 크롬, 현재 지원되는 이번 모서리까지 하자. 또한, 는 에서 노드입니다 어디서나 같은 도구를 활용하여 바벨 구축하십시오 사용할 수 있습니다. 여기서 apc® 예를 볼 수 있습니다.
문서 수 있습니다.
두려워 할 수 있지만, 그 전에 IE9-IE11 및 모서리까지 면쪽 14 위에 내려받습니다 지원부에서는 'let' 하지만 잘못된 (그 don& # 39, t 새로 만드는 'i' 때마다, 따라서 모든 기능을 할 때와 같은 3 위 로깅합니다 칼리오피 우린 'var'). 결국 이 네 모서리 14 된다.
또 다른 방법은 이런 말을 하는 것은 '나' 의 기능을 사용하는 함수가 실행 시간이 아닌 때 바인딩됩니다 생성 함수.
폐쇄 만들 때, 'i' 에 정의된 범위, 아닌 외부 변수에 대한 참조입니다 복제본에 전송되었기 정보기술 (it) 을 만들 때 폐쇄. 당시 평가하실 실행 될 것이다.
이 외 대부분의 해답을 제공할 수 있는 방법으로 해결할 수 있습니다, 또 다른 변수가 만들어 won& t # 39 의 값을 변경할 수 있습니다.
그냥 돌아보 I&; d # 39 추가 설명이 명확성을. # 39 솔루션으로, 개인적으로 I&; d, s 만큼 가는 길을 가장 Harto& # 39 에서 지금 여기에 대답을 자명하다. 모든 코드를 사용할 수 있지만, 여전히 공장 폐쇄, d # 39 게시하기를 i& 작성할 필요 이상의 더미 이유를 설명하기 i& 의견, 새로운 변수가 선언 (freddy 와 1800년 m # 39, & # 39 초) 또는 %s/dbase/ext_table. 임베드된 이상한 폐쇄 구문 (마카베이커).
너희는너희가 이해하는 데 필요한 범위를 변수에 따라 기능을 javascript 가 있다. 이는 중요한 차이를 말하는 것보다 그냥 한 블록 범위 및 c # 가지는 변수를 위한 복사 내부의 작동합니다.
또한 var 대신 키워드를 사용하여 허용하시겠습니까 블록 유효범위 규칙이에요 있다고 하겠습니다. 이 사건에 대한 정의 변수 안의 해야한다고 의심하게 된다. 즉, 이 때문에, t 자 키워드 isn& # 39 실용적으로 호환성에서는.
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var funcs = {};
for (var i = 0; i < 3; i++) {
let index = i; //add this
funcs[i] = function() {
console.log("My value: " + index); //change to the copy
};
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
끝 - < 스니핏 >;!
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = (function() {
var index = i;
return function() {
console.log("My value: " + index);
}
})();
}
끝 - < 스니핏 >;!
참고로 이 기법을 사용하는 것을 일종의 ',' 인덱스화할 가변적입니다 정적 변수가 되고 있는 반환되었습니다 복제본이므로 바인딩되고 내부 함수은. I. e., 그 값은 아니했으니 변경되는지 사이에 있다. 수 있어 매우 유용합니다.
이 실수로 JavaScript 에서 사용하는 일반적인 폐쇄에 대해 설명합니다.
고려해야 합니다.
function makeCounter()
{
var obj = {counter: 0};
return {
inc: function(){obj.counter ++;},
get: function(){return obj.counter;}
};
}
counter1 = makeCounter();
counter2 = makeCounter();
counter1.inc();
alert(counter1.get()); // returns 1
alert(counter2.get()); // returns 0
'시간', '는 각 마케쿤터 호출되었을 {엇회전식: 0} '결과 새 객체를 생성하는 중입니다. 또한 새로운 복제본입니다 '목표' 뿐만 아니라 새 객체를 참조하기 위해 만들어집니다. 따라서 'counter1' 와 'counter2' 서로 독립적으로 지원됩니다.
폐쇄 사용하여 루프가 있는 까다로운.
고려해야 합니다.
var counters = [];
function makeCounters(num)
{
for (var i = 0; i < num; i++)
{
var obj = {counter: 0};
counters[i] = {
inc: function(){obj.counter++;},
get: function(){return obj.counter;}
};
}
}
makeCounters(2);
counters[0].inc();
alert(counters[0].get()); // returns 1
alert(counters[1].get()); // returns 1
[0] [1] '이' 카운터 것을 볼 수 없는 '와' 카운터 독립화됩니다. 실제로, 이 같은 컨트롤러상의 작동합니까 '목표'!
이는 '목표' 하나만 있기 때문에, 아마도 모든 이터레이션에 복제본에 공유됨 루프의 성능 상의 이유로. 비록 ' {엇회전식: 0} '각' 목표 '가 같은 새 객체 생성 이터레이션인지 복제본에 그냥 업데이트됩니까 수신기마다 최신 객체에는 참조.
해결 방법은 사용 중인 다른 도우미 기능:
function makeHelper(obj)
{
return {
inc: function(){obj.counter++;},
get: function(){return obj.counter;}
};
}
function makeCounters(num)
{
for (var i = 0; i < num; i++)
{
var obj = {counter: 0};
counters[i] = makeHelper(obj);
}
}
이 때문에 지역 변수를 사용할 수 있는 기능은 물론, 변수, 함수 인수를 유효범위 직접 할당할지 있다. 새로운 복제본에 빛위에 알려준다.
자세한 토론, 참조하시기 바랍니다 [JavaScript 특히 폐쇄 및 사용] (https://gist.github.com/lucastan/5420969)
가장 단순한 해결책 약간만이라도,
대신 사용:
var funcs = [];
for(var i =0; i<3; i++){
funcs[i] = function(){
alert(i);
}
}
for(var j =0; j<3; j++){
funcs[j]();
}
3 번,, 어떤 경고에는 " 2". 이 때문에 만들어진 공유하여며 for 루프, 폐쇄, 그리고 그 폐쇄 같은 익명 함수 값은 'i' 도 마찬가지다. 이를 위해 공유됨 폐쇄.
var funcs = [];
for(var new_i =0; new_i<3; new_i++){
(function(i){
funcs[i] = function(){
alert(i);
}
})(new_i);
}
for(var j =0; j<3; j++){
funcs[j]();
}
이 아이디어는 전체 본문 뒤에 연구비를 for 루프 ui_policytable_java_spe_policy 인생 (즉시 호출되었을 함수은 표현식에서는) 와 함께 '' i '와' 으로 반군지역 new_i 매개변수입니다 캡처을 있기 때문이다. 지금 'i' 는 이후 csetup 익명 함수 값은 다른 익명 함수 내의 각 함수의 정의.
이 솔루션은 원본 코드가 맞는 것 때문에 그러한 문제를 해결하기 위해 필요한 최소한의 변경으로 이 문제를 앓고 있다. 사실, 이건 기본적으로 전혀 문제가 안 됩니다!
이 짧은 one< /h2> 시도하시겠습니까 h2> <;;;
아니 어레이입니다
no extra for 루프
< br/>;
for (var i = 0; i < 3; i++) {
createfunc(i)();
}
function createfunc(i) {
return function(){console.log("My value: " + i);};
}
[
] [1]<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var funcs = [];
[0,1,2].forEach(function(i) { // let's create 3 functions
funcs[i] = function() { // and store them in funcs
console.log("My value: " + i); // each should log its value.
};
})
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
끝 - < 스니핏 >;!
인쇄:
>. 나의 가치: 0 >. 나의 가치: 1 >. 나의 가치: 2
주요 문제가 OP 코드 보여준 것은 'i' 는 절대 검토완료 보살피되 두 번째 루프지 코드 오류가 있는 것을 증명하기 위해 상상을 해 보세요
funcs[i] = function() { // and store them in funcs
throw new Error("test");
console.log("My value: " + i); // each should log its value.
};
실제로 실행될 때까지 'func 오류가 발생하지 않는 [조메이네스]' ' ()'. 이와 같은 논리를 사용하여, 해야 할 가치를 확연히 알 수 없는 '난' 도 이 때까지도 수집됩니다 점 중 하나. I++ ',' 은 원래 루프 마친 후 'i' 는 '조건' 난 값에 대한 어떤 결과를 3' <. 3 '결함 및 루프 기간말. 이 시점에서 'i' 는 '3' 외면하였나니 func [조메이네스] ()' 가 '와' i '검사됩니다 사용하며, 이는 3 - 항상.
과거 평가하십시오 afaq 합니다 'i' 이 있기 때문에 발생했습니다. 이는 이미 들어온넘 형태로 'func [i]' (여기서 3 개의 고유해야 indexe). 이 값을 캡처하려면 여러 가지 방법이 있습니다. 하나는 그 어떤 함수의 매개 변수로 전달하기 위해 이미 나와 있는 여러 가지 방법으로 삽입하십시오.
또 다른 옵션은 어떤 함수 객체 chunghwa 닫으십시오 가변적입니다 통해 볼 수 있게 된다. 서스리 수행할 수 있는
funcs[i] = new function() {
var closedVariable = i;
return function(){
console.log("My value: " + closedVariable);
};
};
JavaScript 기능ᆞ기술과 over" 닫으십시오 "; 그들은 빛위에 선언, 보존할 수 있는 범위 액세스하도록 액세스하려면 유효범위 com/go/4e6b330a_kr 때에도 그 범위 변경.
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var funcs = []
for (var i = 0; i < 3; i += 1) {
funcs[i] = function () {
console.log(i)
}
}
for (var k = 0; k < 3; k += 1) {
funcs[k]()
}
끝 - < 스니핏 >;!
위의 각 함수를 배열의 범위 닫힌 통해 글로벌 (global, 이유만으로 발생하는 스크램블된 they& # 39 에 정의된 범위, re).
이러한 기능은 현재 가치를 가장 나중에 호출되었을 로깅하기 'i' 글로벌 내시경이요 # 39 의 매직, 좌절, 폐쇄 및 that& 있다.
", JavaScript, 보존할 수 있는 기능을 통해 닫으십시오 유효범위 선언될 수 있는 범위 안에 있는 변수 값을 유효범위 change." 액세스하려면 때에도,
'대신' 이 'var 를 사용하여 만들어 보자' 는 '루프를 만들 때마다 새로운 유효범위 런입니다 분판된 유효범위 각 함수에 대한 닫으십시오 끝났다. 같은 일을 할 다른 방법을 통해 다양한 추가 기능 등을 갖추고 있다.
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
var funcs = []
for (let i = 0; i < 3; i += 1) {
funcs[i] = function () {
console.log(i)
}
}
for (var k = 0; k < 3; k += 1) {
funcs[k]()
}
끝 - < 스니핏 >;!
('let' 는 com/go/4e6b330a_kr 블록 범위지정. 블록은 로 의해 중괄호, 그러나 이번 for 루프 초기화 변수, 'i' 의 경우 선언된 wt. 어려울 것으로 간주됩니다.)
초기 코드:
funcs = {};
for (var i = 0; i < 3; i++) {
funcs[i] = function inner() { // function inner's scope contains nothing
console.log("My value: " + i);
};
}
console.log(window.i) // test value 'i', print 3
',' 가 될 때 func csetup 범위 체인 '기능을 > 내부 -; 글로벌 '. 이후 'i' 의 내부 변수 '기능을 찾을 수 없는' (괜찼습니다 사용하여 선언된 'var' disk_b_s10database 인수로 전달된) 의 가치를 찾을 때까지 계속해서 검색, 'i' 는 결국 '글로벌 유효범위 원하는거요 빈다우드리'.
외부 함수 안에서 함수를 정의할 명시적으로 허용하는 등 감싸 인컨텍스트 [하르토] (https://stackoverflow.com/a/750506) 또는 한 익명의 함수를 사용하여 같은 [비에른] (https://stackoverflow.com/a/750495) did:
funcs = {};
function outer(i) { // function outer's scope contains 'i'
return function inner() { // function inner, closure created
console.log("My value: " + i);
};
}
for (var i = 0; i < 3; i++) {
funcs[i] = outer(i);
}
console.log(window.i) // print 3 still
이제 ',' 가 될 때 func csetup 범위 체인 '기능을 > 내부 -; 외부 함수 '. 이 시간 '나' 에서 볼 수 있다, 외부 function& # 39 의 값을 갖고, 3 회 유효범위 원하는거요 실행됨을 for 루프 때마다 'i' 바인딩될 것입니다. # 39 ',' t it won& 값을 사용하여 빈다우드리 때 내부 처형되었다.
Here 더 자세한 내용을 확인할 수 있습니다.
흔히 우리가 알고 있는 것처럼 잘못 포함하고 있는 루프 생성 할 수 있을 뿐만 아니라, 우리가 왜 여기 진주의료원 폐쇄 및 성능 방안을 적극 검토 중이다.
블록 단위로 사용할 수 있는 새로운 기능을 ES6 관리됨 검토하고 있다.
var funcs = [];
for (let i = 0; i < 3; i++) { // let's create 3 functions
funcs[i] = function() { // and store them in funcs
console.log("My value: " + i); // each should log its value.
};
}
for (let j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
이 코드에서 # 39 의 질문에 OP& 대체됩니다 'let' '대신' var.
[0,2,3].forEach(function(i){ console.log('My value:', i); });
// My value: 0
// My value: 2
// My value: 3
'대신' 포리치 매핑해야 // 편집됩니다 사용할 수 있습니다.
이 질문은 역사는 정말 fs@snapa JavaScript! 이제 피할 수 있는 방법을 사용하여 DOM 노드들을 에서 직접 처리할 수 있는 범위 지정 블록이어야 누르십시보 기능ᆞ기술과 루프 객체에는.
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
const funcs = [1, 2, 3].map(i => () => console.log(i));
funcs.map(fn => fn())
끝 - < 스니핏 >;!
<! - begin 스니핏: js 숨기십시오: 거짓값 콘솔: 진정한 바벨. > 거짓값 -;
<! - 언어: > js 랭 -; const 踰꾪듉 = 도쿠망스게테레멘츠비타냐메 (button" ";). 객체에는 스키스 (버튼) 오마프 (i = >. [i] 곷떒 자야데벤트리스트너 (& # 39, click& # 39 () = >; 콘솔드로그 (i)));
<button>0</button><br>
<button>1</button><br>
<button>2</button>
끝 - < 스니핏 >;!
첫째, 이해 what& # 39 의 잘못된 대체하십시오 코드:
var funcs = [];
for (var i = 0; i < 3; i++) { // let's create 3 functions
funcs[i] = function() { // and store them in funcs
console.log("My value: " + i); // each should log its value.
};
}
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
이 때 ',' i '는' 어레이입니다 func initialized 중입니다 [] '이' 이 초기화되었는지 어레이입니다 증분됩니다 func 크기와 3 = 3, "나는 '때문에' func '어레이입니다 됩니다. 이제 func [j] 때 ' ()' 는 것은 'i', '라는 변수를 사용하여 다시 증분됩니다 디스크입니다. diskid 이미 3.
이 문제를 해결할 수 있는 지금, 우리는 많은 옵션. 다음은 2 명은:
var func = []; 대한 (var i = 0; 내가 <. 3. i++) { = i, 인덱스화할 하겠습니다. [i] = func 함수 () { 콘솔드로그 (", 나의 가치: ". + 인덱스화할); }; } 대한 (var j = 0; j <. 3. j++) { func [j] (); }
var func = []; 함수은 템플런스 (i) { 반환 함수 () { 콘솔드로그 (", 나의 가치: ". + i). }; } 대한 (var i = 0; 내가 <. 3. i++) { [i] = 템플런스 func (i). } 대한 (var j = 0; j <. 3. j++) { func [j] (); }