#javascript #methods
#javascript #методы
Вопрос:
Я просматриваю книгу Никласа Закаса. Я занимаюсь пользовательскими событиями и в настоящее время просматриваю этот код:
var DragDrop = function(){
var dragdrop = new EventTarget(),
dragging = null,
diffX = 0,
diffY = 0;
function handleEvent(event){
//get event and target
event = EventUtil.getEvent(event);
var target = EventUtil.getTarget(event);
//determine the type of event
switch(event.type){
case "mousedown":
if (target.className.indexOf("draggable") > -1){
dragging = target;
diffX = event.clientX - target.offsetLeft;
diffY = event.clientY - target.offsetTop;
dragdrop.fire({type:"dragstart", target: dragging, x: event.clientX, y: event.clientY});
}
break;
case "mousemove":
if (dragging !== null){
//assign location
dragging.style.left = (event.clientX - diffX) "px";
dragging.style.top = (event.clientY - diffY) "px";
//fire custom event
dragdrop.fire({type:"drag", target: dragging, x: event.clientX, y: event.clientY});
}
break;
case "mouseup":
dragdrop.fire({type:"dragend", target: dragging, x: event.clientX, y: event.clientY});
dragging = null;
break;
}
};
//public interface
dragdrop.enable = function(){
EventUtil.addHandler(document, "mousedown", handleEvent);
EventUtil.addHandler(document, "mousemove", handleEvent);
EventUtil.addHandler(document, "mouseup", handleEvent);
};
dragdrop.disable = function(){
EventUtil.removeHandler(document, "mousedown", handleEvent);
EventUtil.removeHandler(document, "mousemove", handleEvent);
EventUtil.removeHandler(document, "mouseup", handleEvent);
};
return dragdrop;
}();
DragDrop.enable();
DragDrop.addHandler("dragstart", function(event){
var status = document.getElementById("status");
status.innerHTML = "Started dragging " event.target.id;
});
DragDrop.addHandler("drag", function(event){
var status = document.getElementById("status");
status.innerHTML = "<br>Dragged " event.target.id " to (" event.x "," event.y ")";
});
DragDrop.addHandler("dragend", function(event){
var status = document.getElementById("status");
status.innerHTML = "<br>Dropped " event.target.id " at (" event.x "," event.y ")";
});
Мой вопрос касается вызова функции DragDrop.enable();
Я не понимаю, как мы можем вызвать функцию включения, которая определяется не непосредственно в DragDrop, а в dragdrop bject (определяется вверху внутри DragDrop).
Спасибо за любое предложение или указание на какое-либо чтение..
Ответ №1:
Код использует немедленно вызываемое функциональное выражение (IIFE) для настройки некоторых переменных, содержащихся в замыкании.
В начале назначения:
var DragDrop = function(){
большинство записало бы это как:
var DragDrop = (function(){
где дополнительный «(» дает понять, что будет выполнено выражение функции и назначен результат, а не сама функция.
Здесь создается объект перетаскивания:
var dragdrop = new EventTarget(),
и свойства, назначенные здесь:
//public interface
dragdrop.enable = function(){
...
};
dragdrop.disable = function(){
...
};
затем здесь возвращается объект, который будет назначен DragDrop (и на который в настоящее время ссылается dragdrop):
return dragdrop;
И, наконец, пустой список параметров вызывает исключение выражения функции:
}();
что чаще всего записывается:
}());
чтобы сбалансировать дополнительные «(«, предложенные ранее. Итак, DragDrop теперь ссылается на возвращаемый объект (экземпляр EventTarget), который имеет доступ ко всем переменным, созданным в IIFE (например, drag, diffX, diffY), но другие функции этого не делают.
Ответ №2:
Переменной DrapDrop присваивается объект dragdrop (из-за оператора return), который имеет свойство enable()
Итак, чтобы вызвать enable, просто перетащите drop.enable()
Комментарии:
1. Итак, если я понимаю, после возврата объекта dragdrop DragDrop = dragdrop ?