Function.prototype.bind = function bind(ctx, ...args) {
const originalFunction = this;
return function (...args2) {
return originalFunction.apply(ctx, args.concat(args2));
};
}
Как видите, возвращаемая функция уже никак не использует свой this.let logMessage = type
.replace('[playerKick]', name1)
.replace('[playerDefence]', name2);
export const generateLogs = (type, player1, player2, damage = 0) => {
const { name: name1 } = player1;
const { name: name2 } = player2;
const logMessage = type
.replace('[playerKick]', name1)
.replace('[playerDefence]', name2);
switch (type) {
case 'start':
return logMessage + LOGS.start
.replace('[time]', getTime())
.replace('[player1]', name1)
.replace('[player2]', name2);
case 'hit':
return logMessage + `${LOGS.hit[getRandom(0, LOGS.hit.length - 1)]
.replace('[playerKick]', name1)
.replace('[playerDefence]', name2)} -${damage}
[${player2.hp} / 100]
`;
case 'defence':
return logMessage + LOGS.defence[getRandom(0, LOGS.defence.length - 1)]
.replace('[playerKick]', name2)
.replace('[playerDefence]', name1);
case 'end':
return logMessage + LOGS.end[getRandom(0, LOGS.end.length - 1)]
.replace('[playerWins]', name1)
.replace('[playerLose]', name2);
case 'draw':
return logMessage + LOGS.draw;
default:
return logMessage + '...';
}
};
export const insertLogs = (logMessage) => {
const el = `<p>${logMessage}</p>`;
chat.insertAdjacentHTML('afterbegin', el);
};
var currentExtraStackFrame = null;
function setExtraStackFrame(stack) {
if (process.env.NODE_ENV === 'production') {
currentExtraStackFrame = stack;
}
}
В процессе сборки process.env.NODE_ENV
было заменено на 'production'
, а так как 'production' === 'production'
- это всегда истинное условие, то от if можно избавиться, оставив только его тело, вот только от блока при этом инструменты не избавляются, так как можно сломать видимость переменных. class PrevClickListener {
constructor(track, next) {
this.track = track;
this.next = next;
}
handleEvent() {
const {track, next} = this;
next.removeAttribute('disabled');
track.scrollTo({
left: track.scrollLeft - track.firstElementChild.offsetWidth,
behavior: 'smooth',
});
}
}
class NextClickListener {
constructor(track, prev) {
this.track = track;
this.prev = prev;
}
handleEvent() {
const {track, prev} = this;
prev.removeAttribute('disabled');
track.scrollTo({
left: track.scrollLeft + track.firstElementChild.offsetWidth,
behavior: 'smooth',
});
}
}
class TrackScrollListener {
constructor(track, prev, next) {
this.track = track;
this.prev = prev;
this.next = next;
}
handleEvent() {
const {track, next, prev} = this;
const trackScrollWidth = track.scrollWidth;
const trackOuterWidth = track.clientWidth;
prev.removeAttribute('disabled');
next.removeAttribute('disabled');
if (track.scrollLeft <= 0) {
prev.setAttribute('disabled', '');
}
if (track.scrollLeft === trackScrollWidth - trackOuterWidth) {
next.setAttribute('disabled', '');
}
}
}
const sliders = document.querySelectorAll('[data-slider]');
for (const slider of sliders) {
const track = slider.querySelector('[data-slider-track]');
const prev = slider.querySelector('[data-slider-prev]');
const next = slider.querySelector('[data-slider-next]');
if (!track || !prev || !next) continue;
prev.addEventListener('click', new PrevClickListener(track, next));
next.addEventListener('click', new NextClickListener(track, prev));
track.addEventListener('scroll', new TrackScrollListener(track, prev, next));
}
import { export as alias } from "module-name";
.addEventListener("click", player.prevAudio)