eval()
:eval("alert('Выполнено!');");
В результате появится всплывающее окно с текстом "Выполнено!".
Но будьте осторожны: функция
eval()
может выполнить любой скрипт, который ей будет предоставлен.Функция
eval()
обладает большими рисками для безопасности. Важно убедиться в том, что JavaScript-строка правильно обработана перед ее использованием в eval()
, так как инъекции кода могут иметь серьезные последствия.Альтернативы для запуска строк JavaScript
let func = new Function("return 'Привет, мир!';");
func(); // Привет, мир!
Этот метод умеет обходить внешний контекст.
В Node.js существует модуль
vm
, который предоставляет отдельный контекст для выполнения JavaScript-строк.const vm = require('vm');
const script = new vm.Script("console.log('Привет из VM');");
script.runInThisContext(); // Привет из VM
vm2
предоставляет ограниченное окружение для запуска ненадежного кода.const { VM } = require('vm2');
const vm = new VM();
vm.run("console.log('Выполнение в песочнице');"); // Выполнение в песочнице
Не забудьте следить за обновлениями в части безопасности и обратите внимание на устаревшие API в
vm2
, чтобы избежать проблем.Ни одна замена не сможет заменить добрые старые теги
<script>
, которые можно использовать для запуска JavaScript-строк с помощью jQuery.let code = "$('body').append('<p>Привет от jQuery!</p>');";
$('<script>').attr('type', 'text/javascript').text(code).appendTo('body'); // Привет от jQuery!
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤4🔥2
Мы работаем с Node.js, и нам нужно прочитать файл, строка за строкой. В Node есть API для такого типа функций, который называется
readLine
(полную документацию можно найти здесь). Это API событий, которые вы можете прослушивать следующим образом:
const fs = require('fs')
const readline = require('readline')
const reader = readline.createInterface({
input: fs.createReadStream('./file.txt'),
crlfDelay: Infinity
})
reader.on('line', (line) => console.log(line))
И допустим, у нас есть простой файл:
line 1
line 2
line 3
Если мы запустим этот код для созданного нами файла, то получим построчный вывод на консоль. Однако работа с событиями — не самый лучший способ получить сопровождаемый код, так как они срабатывают не по порядку, ну и не только.
В дополнение к API событий
readline
также предоставляет асинхронный итератор. Это означает, что вместо чтения строки через слушателей в событии line
мы будем читать строку при помощи нового способа использования ключевого слова for
.Представим, что у нас есть интерфейс, который всегда возвращает промис, разрешенный для нашей строки рассматриваемого файла. Чтобы разрешить эти промисы по порядку, нам нужно сделать примерно следующее:
async function readLine (files) {
for (const file of files) {
const line = await readFile(file) // Imagine readFile is our cursor
console.log(line)
}
}
Однако благодаря асинхронным итерациям (например,
readline
) мы можем сделать так:const fs = require('fs')
const readline = require('readline')
const reader = readline.createInterface({
input: fs.createReadStream('./xpto.txt'),
crlfDelay: Infinity
})
async function read () {
for await (const line of reader) {
console.log(line)
}
}
read()
Обратите внимание, что теперь мы используем новое определение
for
— for await (const x of y)
.@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🎉5🔥1🥰1
This media is not supported in your browser
VIEW IN TELEGRAM
https://codepen.io/creativeocean/pen/gOvYEgq
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍17🔥3❤2
Чтобы понять суть замыканий, мы сначала рассмотрим их характеристики:
— Даже если внешняя функция перестает существовать, замыкание по-прежнему имеет доступ к ее переменным.
— Замыкания не имеют доступа к параметру
args
своей внешней функции.Давайте разберем подробнее первый пункт. Это основная функциональность любого замыкания. В этом сама суть замыканий и принцип работы.
Чтобы увидеть это в действии, мы выполним вот эту функцию
buttonProps
:let buttonProps = (borderRadius) => {
const createVariantButtonProps = (variant, color) => {
const newProps = {
borderRadius,
variant,
color
};
return newProps;
}
return createVariantButtonProps;
}
let primaryButton = buttonProps("1rem");
Вызов функции
buttonProps
вернет нам другую функцию, которая является нашим замыканием.Теперь давайте выполним это замыкание:
const primaryButtonProps = primaryButton("primary", "red");
В результате выполнения замыкание возвращает следующий объект:
{
"borderRadius":"1rem",
"variant":"primary",
"color":"red"
}
borderRadius
)?@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤5🔥1
String.fromCharCode()
возвращает строку, созданную из указанной последовательности значений единиц кода UTF-16.Синтаксис
String.fromCharCode(num1[, ...[, numN]]
num1, ..., numN
— Последовательность чисел, являющихся значениями единиц кода UTF-16. Диапазон составляет от 0 до 65535 (0xFFFF). Числа больше 0xFFFF усекаются. Проверка достоверности не производится.
Метод
String.fromCharCode()
возвращает примитивную строку, а не объект String
.Поскольку метод
fromCharCode()
является статическим методом объекта String
, вы всегда должны использовать его как String.fromCharCode()
, а не как метод созданного вами экземпляра String
.fromCharCode()
. String.fromCharCode(65, 66, 67); // "ABC"
Хотя большинство распространённых значений Юникода может быть представлено одним 16-битным числом (как ожидалось на ранней стадии стандартизации JavaScript) и метод
fromCharCode()
может использоваться для возврата одного символа для самых распространённых значений (точнее, значений UCS-2, которые являются подмножеством самых распространённых символов UTF-16), для работы со всеми допустимыми значениями Юникода (занимающими до 21 бита) одного метода fromCharCode()
недостаточно. Поскольку большие кодовые точки используют (самое меньшее) два «суррогатных» числа для представления одного символа, для возврата таких пар можно использовать метод String.fromCodePoint()
(являющийся частью черновика ES6) и, таким образом, адекватно представлять эти символы.@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤4😁1🎉1
const isRelative = (path) => !/^([a-z]+:)?[\\/]/i.test(path);
isRelative('/foo/bar/baz'); // false
isRelative('C:\\foo\\bar\\baz'); // false
isRelative('foo/bar/baz.txt'); // true
isRelative('foo.md'); // true
const isHexColor = (color) => /^#([0-9A-F]{3}|[0-9A-F]{4}|[0-9A-F]{6}|[0-9A-F]{8})$/i.test(color);
isHexColor('#012'); // true
isHexColor('#A1B2C3'); // true
isHexColor('012'); // false
isHexColor('#GHIJKL'); // false
const diffDays = (date, otherDate) => Math.ceil(Math.abs(date - otherDate) / (1000 * 60 * 60 * 24));
diffDays(new Date('2014-12-19'), new Date('2020-01-01')); // 1839
const copyToClipboard = (text) => navigator.clipboard.writeText(text);
copyToClipboard("Hello World");
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25❤3🔥3👎2
О чём говорится в статье:
vh
, vw
, vmin
и vmax
.svh
и svw
.nth-child
позволяет выбирать дочерние элементы по порядковому номеру и добавлять класс элемента.@scope
позволяет создавать пространства имён и задавать стили с ограниченной областью видимости.Enjoy)
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19👍7❤1
Функция высшего порядка — это просто функция, которая либо принимает одну или несколько функций в качестве аргументов, либо возвращает функцию в качестве результата. В этой статье мы рассмотрим, что такое функции высшего порядка, почему они полезны и как использовать их в своём коде.
Абстрагируясь от общих шаблонов и операций, функции высшего порядка облегчают написание чистого и многократно используемого кода.
Функции высшего порядка полезны по нескольким причинам:
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍8🥰1👏1
Хорошая статья, описывающая, как JavaScript работает под капотом. Описывается, как во всём этом процессе участвует куча, стек вызовов, цикл событий и т.д.
Особенно это актуально освежить перед собеседованием, скорее всего пригодится.
Некоторые факты из статьи:
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤2🔥1
🔥 Monolith - это инструмент CLI для сохранения полных веб-страниц в виде отдельных HTML-файлов. Он объединяет все ресурсы в один файл, обеспечивая автономный доступ и простое архивирование.
▪ Github
@javascriptv
▪ Github
@javascriptv
👍12🔥4❤1
План статьи
Понимание инструментов
Добавление файлов конфигурации
—
package.json
—
"type": "module"
в package.json
— Зависимости
— Конфигурация TypeScript
—
.gitignore
— Каталог
src
Добавление скриптов
— Скрипт
build
— Скрипт
start
— Скрипт
dev
——
tsc --watch
——
node --watch
——
run "/dev:/"
@javascriptv
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤2🔥2