개체 (obj)의 모든 함수 속성을 사용하고 다른 함수 (p())로 래퍼 함수를 작성하려고했습니다.클로저 및 함수 작성 문제가있는 경우
이 코드는 내 뜻을 설명합니다.
//Setup code
function p(input){
//do stuff
return new_output;
}
obj = {
prop1: function(){...},
prop2: function(){...},
prop3: function(){...}
}
//Here's the wrapper function
r = new R(obj);
//Expected behaviour
r.prop1(a1,a2); //Just like saying p(obj.prop1(a1,a2))
는 여기에 내가 CONSOLE.LOG를 통해 r.prop1(), 콘솔을 실행 할 때마다, 잘못된 멤버, "prop3"및 OBJ를 [반환
function R (obj) {
for (var member in obj) {
//Mirrors obj's members
this[member] = function (args) {
var fn,inner_member = member;
//Convert to array for 'apply'
args = Array.prototype.slice.call(args,0);
fn = obj[member];
//Returns unexpected values, poo...
console.log(inner_member);
return p(fn.apply(fn,args));
}
};
}
불행하게도 구현하려고 시도한이다 member]는 "obj.prop3"을 반환합니다. 모두 잘못 됐어.
이것은 폐쇄와 관련이 있으며 새로 만든 멤버 멤버 함수가 범위를 벗어나는 방법과 관련이 있다고 생각합니다.
어떻게 수정합니까?
편집 : 데이비드 플래너의 자바 스크립트 : 확실한 가이드 8 장, 섹션 섹션 폐쇄에 마지막 예를 들어 내가 위에 쓴 그대로 반영 3에 거의 직접이 질문에 대한 대답. 내 문제를 이해하는 열쇠는 함수가 정의 된 것과 동일한 범위 체인에서 호출된다는 것입니다. 함수는 객체 및 관련 범위 체인입니다. 일명 클로저 야.
또한, 'member' 변수를 선언하는 것을 잊지 마라. (for obj의 var 멤버)' – CMS
@CMS : 잘 잡는다. 그건 적어도 * 당신이 저를 붙잡는 것을 잊어 버린 세 번째 시간입니다. o) 고정. – user113716
원래의 예제에서 slice.call을 수정하고 var 멤버를 추가했습니다. 감사합니다. –