function createCounter() {
let counter =0;
counter = counter - 10
const myFunction = function () {
counter = counter+1;
return counter
}
return myFunction
}
let z = createCounter() // Вернули в переменную z функцию "myFunction" у которой в замыкании есть counter.
// counter внутри на данный момент равен -10.
// Вызвали функцию и вывели результат в консоль.
// Так как внутри функции counter берётся из замыкания, то при вызове функции получаем
// -10 + 1
console.log(z()) // -9
// В данном примере - бесполезный ничего не делающий вызов.
// То есть создаётся ещё один НОВЫЙ счётчик, со своим замыканием, но он никуда не сохраняется.
createCounter()
// Снова вызвали функцию и вывели результат в консоль.
// -9 + 1
console.log(z()) // -8
где я допускаю ошибку
Второй вопрос откуда берется counter при втором вызове console.log(z())
<form style="position:relative" target="area" method="POST">
<input id="texexpert" name="texe"class="header-search-input" autocomplete="off" placeholder="Искать" value="" >
<input id="button" class="texex" type="submit" title="Нажмите,чтобы найти">
</form
<script>
$('.texex').on('click', function(e){
e.preventDefault();
const texex = document.querySelector("input[name='texe']").value;
sessionStorage.setItem('texexperto', texex);
const texoton = sessionStorage.getItem('texexperto');
console.log(texoton);
});
</script>
constructor
. Подозреваю что вы делаете это в консоли браузера и переменную эту никогда не объявляли, поэтому JS выдаст вам свойство constructor
глобального объекта. В данном случае это будет window.constructor
который конечно же никакого отношения к вашей функции Func не имеет.constructor
имеет смысл смотреть у экземпляра объекта, а не у класса.let f = new Func();
console.log(f.constructor === Func) // true
Content model:
- If the element has a label attribute and a value attribute: Nothing.
- If the element has a label attribute but no value attribute: Text.
- If the element has no label attribute: and is not a child of a datalist element: Text that is not inter-element white space.
- If the element has no label attribute and is a child of a datalist element: Text.
const mod = (a, b) => ((a % b) + b) % b;
// или
const mod = (a, b) => a - (b * Math.floor(a / b));
console.log([ 12, 367, -54, 789, -567 ].map(n => mod(n, 360)));
const setup = {port:8000}
const express = require ('express');
const puppeteer = require('puppeteer');
const app = express ();
app.get('/', (req, res) => {
const url = req.query.url;
// вот тут Вы на каждый запрос создаете весьма тяжелую функцию
// в ней 203 AST ноды
// и она жрет в среднем 220КБ оперативы
// (node: 14.4.0; v8: 8.1.307.31-node.33, мерил через process.memoryUsage().heapUsed)
let scrape = async () => {
// а еще на каждый запрос запускам новый браузер
// у ноды это особо памяти не отнимет, а вот у системы - прилично
const browser = await puppeteer.launch({args: ['--no-sandbox']});
const page = await browser.newPage();
// еще и разрешаем запросу из браузера жить вечно
// если конечно сервак не оборвет коннект
await page.setDefaultNavigationTimeout(0);
await page.setUserAgent('Mozilla/5.0 (Linux; Android 7.0; NEM-L51) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.81 Mobile Safari/537.36');
await page.setViewport({width: 375, height: 812});
// куда мы отправляем браузер?
// переменная url у нас из req.query.url - а следовательно начинается с /
// то есть без хоста и протокола...
await page.goto(url);
// что-то мне подсказывает, что это работает не совсем так
// как Вы ожидаете
// https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageevaluatepagefunction-args
// читаем: If the function passed to the page.evaluate returns a non-Serializable value, then page.evaluate resolves to undefined
const bottomSheet = await page.evaluate(() => {
return document.querySelector('div[data-marker="bottom-sheet"]');
});
// так как undefined !== null данное условие всегда истинно
if (bottomSheet !== null) {
// здесь по идее придет Promise.reject который мы не ловим (об этом ниже)
await page.click('div[data-marker="bottom-sheet"] button');
}
// и еще раз... ловите доку на нужный метод:
// https://github.com/puppeteer/puppeteer/blob/main/docs/api.md#pageselector
const phoneButton = await page.evaluate(() => {
return document.querySelector('a[data-marker="item-contact-bar/call"]');
});
// всегда ложное условие...
if (phoneButton === null) {
await browser.close();
return false; // ...с return внутри...
}
// еще 1 способ зависнуть (дефолтный таймаут 30 сек)
await page.waitForSelector('a[data-marker="item-contact-bar/call"]');
await page.click('a[data-marker="item-contact-bar/call"]');
try {
await page.waitForSelector('span[data-marker="phone-popup/phone-number"]');
} catch (e) {
await browser.close();
return false;
}
const result = await page.evaluate(() => {
console.log('phone', document.querySelector('span[data-marker="phone-popup/phone-number"]'));
return document.querySelector('span[data-marker="phone-popup/phone-number"]').innerHTML;
});
await browser.close();
return result;
};
// не ловим reject промиса
// и в случае reject не завершаем запрос
// и он тоже висит в памяти
scrape().then((value) => {
console.log(value);
if (value === false)
res.send(500);
// при value === false будет запись в закрытый поток... (или у express есть защита от дурака?)
res.send(value);
// абсолютно бесполезное действие...
scrape = null;
});
});
app.get('/test', (req, res) => {
res.send('Тест');
});
app.listen(setup.port, () => {
console.log('Сервер: порт %s - старт!', setup.port);
});
кто может объяснить это поведение?
For elements whose layout is governed by the CSS box model, any value other than none for the transform also causes the element to become a containing block, and the object acts as a containing block for fixed positioned descendants.
не особо разобравшись в ее теорииЭто звучит забавно.
document.querySelector('.allstatus-btn').addEventListener('click', () => {
const items = Object.fromEntries(Array.from(
document.querySelectorAll('.number-all'),
n => [ n.innerText, n ]
));
fetch('https://api.novaposhta.ua/v2.0/json/', {
method: 'POST',
body: JSON.stringify({
modelName: 'TrackingDocument',
calledMethod: 'getStatusDocuments',
methodProperties: {
Documents: Object.keys(items).map(n => ({
DocumentNumber: n,
Phone: '',
})),
},
apiKey: '',
}),
})
.then(r => r.json())
.then(r => r.data.forEach(n => items[n.Number].innerHTML += n.Status));
});
v:slot:title
, есть v-slot:title
или сокращенно #title