내가 실험하고이 매우 간단한 프레임 워크를 가지고 (내가 깊이에 더 많은 자바 스크립트의 함수 프로토 타입을 배울 수 있도록합니다.)왜 bind() 또는 apply()가 여기서 작동하지 않지만 call()은 작동합니까?
(function(){
var app = {
ui: {
app: document.querySelector('.app'),
settings: document.querySelector('.settings'),
},
actions: 'click settings openSidebar'
,
functions: {
openSidebar: function(e){
console.log(this); // <- expected value of this is 'app.ui'
}
},
run: function(){
var a1 = this.actions.split("\n");
var a2 = this.actions.split(" ");
var self = this;
this.ui[a2[1]].addEventListener(a2[0], function(e){
app.functions.openSidebar.call(self.ui,e);
});
}
};
app.run();
})();
이 잘 작동합니다. 콘솔의 출력은 다음과 같습니다 그러나
Object {ui: Object, actions: "click settings openSidebar", functions: Object, run: function}
, 나는 이런 식으로 작업을 수행하려고하면
이var self = this;
this.ui[a2[1]].addEventListener(a2[0], function(e){
app.functions.openSidebar(e);
}.bind(this));
openSidebar()
에서 this
의 문맥 openSidebar (일명 바인드 효과가 없습니다)입니다. 콘솔 출력 : 그러나
Object {openSidebar: function}
, 내가 지금처럼 apply
기능을 사용하려고하면
app.functions.openSidebar.apply(self.ui,e);
그것은 인수 (e
)이되지 않는다는 점을 제외 (openSidebar에서 this
이 app.ui
입니다) 잘 작동 통과 되니, e == undefined
.
여기 간다 :
1. 왜 첫 번째 예에서 일을 (전혀)에 결합하지 않는 이유는 무엇입니까?
2. 적용이 인수를 사용하지 않고 작동하는 이유는 무엇입니까 (e
(이벤트))?
그리고 추가 브라우니 포인트
은 :3. 왜 통화 작업이 예상 않는?
자세한 답변을 해주셔서 대단히 감사합니다. 존. 그것은 많은 도움이됩니다. 그리고 나는 동의해야한다. 질문 3은 회상에서 이상한 질문이었다 :-) – subZero