Javascript로 둘러보고 (읽는 법 : learning) 주변을 둘러 보았고, 매우 이해하기 어려운 것 같습니다. 브라우저에 대한 중요성을 '느슨하게하는'것으로 보이는 폐쇄 및 참조와 관련이 있습니다.Javascript, 클로저의 이상한 행동
사용중인 브라우저는 입니다. Chromium 5.0.307.7입니다.
어쨌든, 여기에 몇 가지 코드는 다음과 같습니다
여기에 발생하는 첫 번째 인수가 올바른는 HTMLElement에 기록됩니다 것입니다 있지만, 모든 사람이 후하지 않습니다 무엇HTMLElement.prototype.writeInSteps = function() {
var i = 0;
var elem = this;
var args = arguments;
function step() {
elem.innerHTML += args[i];
if(i < args.length) {
i += 1;
} else {
elem.innerHTML = "";
i = 0;
}
setTimeout(step, 500);
}
step();
}
. 첫 번째 인수 다음에 'elem'이 참조하는 다른 요소에 다음 인수가 기록됩니다. 나는이 함수를 호출 한 후 아무것도 기록 삼가 경우
div.writeInSteps("This", " is", " not", " working");
$id("body").innerHTML += "Doh!";
, 작동하는 것 같다 :
나는 또한 그것을 언급해야한다, 이것은 단지 다음과 같이이 함수를 직접 호출 한 후 뭔가를 쓸 때 일어날 것 같다 승인. 내가 대신 위의 코드를 변경하는 경우
는 :
HTMLElement.prototype.writeInSteps = function() {
var i = 0;
var e = this.id;
var args = arguments;
function step() {
var elem = $id(e);
elem.innerHTML += args[i];
if(i < args.length) {
i += 1;
} else {
elem.innerHTML = "";
i = 0;
}
setTimeout(step, 500);
}
step();
}
모든 멋쟁이입니다. 내 질문은 첫 번째 버전에서 실제로 무슨 일이 벌어지고있는 것입니까?
EDIT : "... 직접 작성한 후 ..."에 대한 요청 세부 정보 및 ntownsend에서 요청한 브라우저 사용법으로 업데이트되었습니다. Bryan Matthews,이 질문을 지나치게 복잡하게 만들지 않고 테스트 페이지를 제공하는 방법을 잘 모르겠습니다.
수정 된 버전에서 'elem'을 지역 변수로 만들어야합니다. 지금은 함축적 인 전역 변수이며 조심하지 않으면 기묘한 오류를 일으키기 쉽습니다 (왜 필요하지 않으면 걱정하지 않으시겠습니까?). –
이 동작을 보여주는 샘플 페이지를 제공해 주시겠습니까? 첫 번째 버전을 사용해 보았는데 여러 번 동시에 실행하는 것을 포함하여 잘 작동하는 것 같습니다. –
제프가 옳습니다. 이것은 리팩토링 오류 일뿐입니다. –