Как понять такой код?

Изначально код был минимизирован.
function LongClick(e, t, n) {
    "use strict";
    var i = this;
    if (this.trackingClick = !1, 
		this.trackingClickStart = 0, 
		this.targetElement = null, 
		this.touchStartX = 0, 
		this.touchStartY = 0, 
		this.touchBoundary = 10, 
		this.time = t, 
		this.handler = n, 
		this.timer = null, 
		this.layer = e, 
		!e || !e.nodeType) throw new TypeError("Layer must be a document node");
    this.onTouchStart = function() {
        return LongClick.prototype.onTouchStart.apply(i, arguments)	}, 
	this.onTouchMove = function() {
        return LongClick.prototype.onTouchMove.apply(i, arguments) }, 
	this.onTouchEnd = function() {
        return LongClick.prototype.onTouchEnd.apply(i, arguments)    }, 
	this.onTouchCancel = function() {
        return LongClick.prototype.onTouchCancel.apply(i, arguments)   }, 
	window.navigator.msPointerEnabled ? 
		(	this.startEventName = "MSPointerDown", 
			this.moveEventName = "MSPointerMove", 
			this.endEventName = "MSPointerUp", 
			this.cancelEventName = "MSPointerCancel") 
		:(	this.startEventName = "touchstart", 
			this.moveEventName = "touchmove", 
			this.endEventName = "touchend", 
			this.cancelEventName = "touchcancel"), 
	e.addEventListener(	this.startEventName, this.onTouchStart, !1), 
	e.addEventListener(this.moveEventName, this.onTouchMove, !1), 
	e.addEventListener(this.endEventName, this.onTouchEnd, !1), 
	e.addEventListener(this.cancelEventName, this.onTouchCancel, !1)
}


По заглавным буквам предположил, что это объявление класса.
Что не понятно, так это
Первое: Блок IF - в скобках идет перечисление команд через запятую. Как это понять? Когда будет условие истинно, когда ложно? Или все условия должны быть истинны, что бы блок был истинным? Но это присваивания, и если присваивание возможно (а оно заведомо возможно), то эти команды всегда вернут истину. И только последняя команда (!e || !e.nodeType) условна.
Второе: Первое присваивание в блоке IF ---- this.trackingClick = !1 чему будет равно? Что значит выражение !1?
Третье: После блока IF команды перечисляются через запятую, как будто это массив?

И так весь код, все через запятую. Помогите понять пожалуйста
Или ткните где почитать
  • Вопрос задан
  • 114 просмотров
Решения вопроса 1
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Блок IF - в скобках идет перечисление команд через запятую.

Оператор запятая. Выполняет все блоки, но возвращает последний. т.е. типа зачем-то туда засунули присваивание элементов.
В третьем случае непонятно, зачем они это сделали, т.к. точно также бы работала ;. Видимо ожидалось, что в начале будет return, и тогда можно будет все в одну строчку написать через запятые.
Почитать тут https://habrahabr.ru/post/116827/
UPD: Вот я его вам перевел в нормальный вид.
function LongClick(e, t, n) {
    "use strict";
    var i = this;
    
    this.trackingClick = false;
    this.trackingClickStart = 0;
    this.targetElement = null;
    this.touchStartX = 0;
    this.touchStartY = 0;
    this.touchBoundary = 10;
    this.time = t;
    this.handler = n;
    this.timer = null;
    this.layer = e;

    if (!e || !e.nodeType) {
        throw new TypeError("Layer must be a document node");
    }
    this.onTouchStart = function() {
        return LongClick.prototype.onTouchStart.apply(i, arguments);
    };
    this.onTouchMove = function() {
        return LongClick.prototype.onTouchMove.apply(i, arguments);
    }; 
    this.onTouchEnd = function() {
        return LongClick.prototype.onTouchEnd.apply(i, arguments);
    }; 
    this.onTouchCancel = function() {
        return LongClick.prototype.onTouchCancel.apply(i, arguments);
    };
    if(window.navigator.msPointerEnabled) {
        this.startEventName = "MSPointerDown"; 
        this.moveEventName = "MSPointerMove"; 
        this.endEventName = "MSPointerUp"; 
        this.cancelEventName = "MSPointerCancel"
    } else {
        this.startEventName = "touchstart"; 
        this.moveEventName = "touchmove"; 
        this.endEventName = "touchend"; 
        this.cancelEventName = "touchcancel";
    }
    e.addEventListener(this.startEventName, this.onTouchStart, false);
    e.addEventListener(this.moveEventName, this.onTouchMove, false);
    e.addEventListener(this.endEventName, this.onTouchEnd, false);
    e.addEventListener(this.cancelEventName, this.onTouchCancel, false);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы