function listener(event) {
const target = event.target.closest('.app__item');
target.querySelectorAll('.equalizer').forEach(
elem => elem.style.display = 'block'
);
// так как дальнейшие клики будут гонять бесполезный цикл, то лучше отписаться
target.removeEventListener('click', listener);
}
document.querySelectorAll('.app__item').forEach(
item => item.addEventListener('click', listener)
);
x = delete y.z
можно, так как оператор delete - является выражением и возвращает true или falsex = var y
нельзя, так как var ничего не возвращает, даже undefined не вернет.var arrey = [];
var a = 1;
var b = 2;
arrey[0] = a;
arrey[1] = b;
var arrey = [];
var a = 1;
var b = 2;
arrey.push(a, b);
или так:var a = 1;
var b = 2;
var arrey = [a, b];
let loadScript = (url, callbackScript, elem) => {
let script = document.createElement('script');
script.src = url;
document.getElementsByTagName('body')[0].append(script);
script.onload = function() {
callbackScript(elem); // Как в эту функцию передать elem? elem находится снизу при обходе массива
};
};
App.prototype.initModule = function(array) {
array.forEach(elem => {
loadStyles.call(DATA, DATA[elem].styleURL); // Вот здесь передаю callback
loadScript.call(DATA, DATA[elem].scriptURL, callback, elem);
});
};
const content = document.body.querySelector('.editer');
const htmlTags = content.getElementsByTagName("*");
const navs = []; // здесь let не нужен
for(let i = 0; i < htmlTags.length; i++) {
const htmlTag = htmlTags[i];
const lastNav = navs[navs.length - 1]; // resH2 всегда будет таким (см. комменты ниже)
const lastChildOfLastNav = lastNav && lastNav.children[lastNav.children.length - 1]; // resH3 всегда будет таким
switch(htmlTag.localName) {
case 'h2':
setID(htmlTag, i);
addItem(navs, htmlTag);
break;
case 'h3':
setID(htmlTag, i);
// тот find что у Вас всегда найдет последний элемент если он есть, не зачем гонять лишний цикл
if(lastNav) {
addItem(lastNav.children, htmlTag);
}
break;
case 'h4':
setID(htmlTag, i);
// опять же был лишний цикл ради последнего элемента, да еще и в него вложен такой же
if(lastChildOfLastNav) {
addItem(lastChildOfLastNav.children, htmlTag);
} else if(lastNav) {
addItem(lastNav.children, htmlTag);
}
break;
}
}
function addItem(obj, {innerText: name, id}) {
obj.push({
name,
id,
children: []
});
}
function setID(htmlTag, i) {
htmlTag.setAttribute('id', `nav-${i}`);
}
Есть ли смысл начинать читать её сейчас, или на сегодняшний день она уже слишком устарела?Фундаментальные знания не устаревают никогда, а в данной книге именно фундамент.
насколько я понимаю, написана она опираясь на старый стандартДаже оператор with, который deprecated начиная с es5 можно использовать в самом современном движке js. Каждая новая версия ES лишь дополняет предыдущую, но не отменяет ее, хотя некоторые вещи и становятся нежелательными (вроде использования var после появления let и const), новые вещи основываются на старых (иначе бы babel не работал). Ну а то немногое, что совсем deprecated (вроде оператора with или глобального объекта в качестве this по умолчанию) - как правило плохие практики и в таких книгах почти не освещаются
import {curry} from 'ramda';
export const subscribe = curry((target: EventTarget, eventName: string, handler: EventListenerOrEventListenerObject): (() => void) => {
target.addEventListener(eventName, handler);
return () => target.removeEventListener(eventName, handler);
});
export const subscribe = (target, eventName, handler) => {
target.addEventListener(eventName, handler);
return () => target.removeEventListener(eventName, handler);
};
const curry = (i) => (e) => changeCountry(e, i);
const unsubscribe = subscribe(button, 'click', curry(i));
// когда подписка больше не нужна, просто вызываем unsubscribe()
const original = globalThis.libraryVariable; // сохраняем предыдущее значение заменяемой переменной
globalThis.libraryVariable = libraryExport; // перезаписываем нашей либой
libraryExport.noConflict = () => {
globalThis.libraryVariable = original; // восстанавливаем сохраненное значение
return libraryExport; // возвращаем нашу либу
};
где: