Вот упрощен отрывок из какого-то кода, который я написал для управления планшетом жестами на холст элементахтребуется помощь в понимании использования замыкания в этом коде
первой функцией, которая принимает элемент и словарь обратных вызовов и зарегистрировать события плюс добавление другие функции, такие как жесты «Hold»:
function registerStageGestures(stage, callbacks, recieverArg) {
stage.inhold = false;
stage.timer = null;
var touchduration = 1000;
var reciever = recieverArg || window;
stage.onLongTouch = function(e) {
if (stage.timer) clearTimeout(stage.timer);
stage.inhold = true;
if (callbacks.touchholdstart) callbacks.touchholdstart.call(reciever, e);
};
stage.getContent().addEventListener('touchstart', function(e) {
e.preventDefault();
calcTouchEventData(e);
stage.timer = setTimeout(function() {
stage.onLongTouch(e);
}, touchduration);
if (callbacks.touchstart) callbacks.touchholdstart.call(reciever, e);
});
stage.getContent().addEventListener('touchmove', function(e) {
e.preventDefault();
if (stage.timer) clearTimeout(stage.timer);
if (stage.inhold) {
if (callbacks.touchholdmove) callbacks.touchholdmove.call(reciever, e);
} else {
if (callbacks.touchmove) callbacks.touchmove.call(reciever, e);
}
});
stage.getContent().addEventListener('touchend', function(e) {
e.preventDefault();
if (stage.timer) clearTimeout(stage.timer);
if (stage.inhold) {
if (callbacks.touchholdend) callbacks.touchholdend.call(reciever, e);
} else {
if (callbacks.touchend) callbacks.touchend.call(reciever, e);
}
stage.inhold = false;
});
}
позже я называю registerStageGestures на несколько элементов (представленных «View» объектов) в одной и той же странице. Что-то вроде:
function View() {
var self=this;
..
function InitView() {
...
registerStageGestures(kineticStage, {
touchstart: function(e) {
// do something
},
touchmove: function(e) {
// do something
},
touchendunction(e) {
// do something
},
touchholdstart: function(e) {
// do something
},
touchholdmove: function(e) {
// do something
},
touchholdend: function(e) {
// do something
},
}, self);
Все работает отлично, но я озадачен две вещи в реализации registerStageGestures:
Во-первых, это необходимо сделать inhold, таймер и onLongTouch членов стадии? или затворы делают все хорошо, если они являются локальными варами в registerStageGestures?
Во-вторых, нужно ли вызывать обратные вызовы с помощью .call (приемник, синтаксис?) Я делаю это, чтобы убедиться, что код обратного вызова будет работать в контексте представления, но я не уверен, ? нужен
любой вход высоко ценится
Благодаря
thx для этого, это помогло, я искал ответ, который включал мой код. – kofifus
Конечно. Покажите человеку закрытие, и он поймет сферу действия ... Научите человека закрыться ... – Norguard