Где возможно, кэшируйте выборки jQuery:
var onDrag = (function(){
var draggable = $('#draggable'),
ctx = canvas.context; // btw, don't you mean canvas.getContext('2d')?
return function(key) {
var box = $('#box-' + key),
fromRect = box.offset(),
fromHeight = box.height(),
fromWidth = box.height(),
toRect = draggable.offset(),
toWidth = draggable.width(),
startX = toRect.left + toWidth / 2,
startY = toRect.top + 4,
endX = fromRect.left + fromWidth / 2,
endY = fromRect.top + fromHeight / 2;
ctx.clearRect(0, 0, 5000, 5000);
ctx.beginPath();
ctx.moveTo(startX, startY);
ctx.lineTo(endX, endY);
ctx.strokeStyle = "rgba(0, 0, 0,1)";
ctx.stroke();
};
})();
Общее правило: Если у вас есть функция, которая будет запускаться несколько раз подряд, убедитесь, что вы делаете только то, что АБСОЛЮТНО ДОЛЖНО БЫТЬ СДЕЛАНО при каждом вызове функции.