Как сделать eval в discord js

Функция eval() выполняет код, переданный ей в виде строки. Код, переданный функции, выполняется в той области видимости, где была вызвана функция.

Вызвав функцию eval() в коде верхнего уровня, она будет оперировать глобальными переменными и функциями. Вызвав её в области видимости функции, она будет оперировать локальными переменными и функциями.

Если функции eval() передать значение, отличное от строки, она просто вернёт это значение.

Если для функции eval() создать псевдоним (присвоить её другой переменной), а затем в области видимости какой-нибудь функции попытаться вызвать функцию через псевдоним то, она будет работать в глобальной области видимости, а не в локальной. Это значит, что код будет выполнен с отсутствием доступа к локальным переменным и функциям.

Синтаксис

eval(str);

Аргументы

  • str: Строка, представляющая собой JavaScript-код.

Возвращаемое значение

  • Возвращает значение последнего выполненого выражения или инструкции либо значение undefined, если последнее выражение или инструкция не возвращают значения.

Пример

var code = «var x = 10; alert(x * 10);»; eval(code); var x = eval(«2 + 2») alert(x); «use strict»; eval(«var a = 5;»); alert( a ); // Ошибка. Переменная не определена

Источник: puzzleweb.ru

Discord.js Development — Eval Command — Eposide 8

Остановить цикл в discord.js

Мне нужна помощь, чтобы остановить цикл в discord.js. Я не знаю, что делать, чтобы остановить цикл.

let sec = 5; let timer = setInterval(function() < if (command = «8») message.channel.send(«ddd»); >, sec * 1000); if (command = «stoploop») clearInterval(timer);

Моя проблема в том, что clearInterval не определен.

Комментарии (1)

Не могли бы вы добавить ошибку, которую вы получаете в вопросе

12.02.2019 13:54

Оператор pass в Python — это простая концепция, которую могут быстро освоить даже новички без опыта программирования.

Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции — это способ манипулировать массивами и играть с массивами данных. Благодаря.

Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний.

Все о массиве Dependency и его связи с useEffect.

Toor — Travel Booking Angular Template один из лучших Travel < var prefix = » = «, command = message.content.slice (prefix.length).split (» «)[0], sec = 5; switch (command) < case «startloop»: if (message.channel.loop) return message.channel.send (‘loop is already started’); else message.channel.loop = setInterval (() =>message.channel.send (‘ddd’), sec * 1000); break; case «stoploop»: if (!message.channel.loop) return message.channel.send (‘no loop to stop lol’); else < clearInterval (message.channel.loop); message.channel.loop = false; >break; > >);
Комментарии (1)

Добро пожаловать в СО. Можете ли вы добавить текст, чтобы объяснить, как этот код отвечает на вопрос.

Create Eval Command Discord.js #18

25.10.2019 20:06

let sec = 5; let timer = setInterval(function() < if (command = «8») message.channel.send(«ddd»); >, sec * 1000); if (command = «stoploop») clearTimeout(timer);

Причина, по которой вы получаете сообщение об ошибке, заключается в том, что clearInterval() не является функцией в JavaScript. Я считаю, что функция, которую вы ищете, — это clearTimeout().

Еще по теме:  Discord hookhelper exe не удается найти

18.12.2019 16:25

Я буду хранить интервал в клиенте:

let sec = 5; message.client.variables.timer = setInterval(function() < if (command = «8») message.channel.send(«ddd»); >, sec * 1000); //When you want to stop the loop clearInterval(message.client.variables.timer);
11.04.2021 12:33

Вы не должны использовать setInterval , так как discord.js является библиотекой управляемый событиями. Вы должны кодировать так, как задумал разработчик discord.js. используйте это вместо этого:

this.client.on(‘ready’, () => < //Runs when discord bot is fully loaded. this.client.on(‘message’, async (msg) =>< //Runs when a message was sent to the channel. let parseTokens = yourCommandParser(msg.content); //Parses your command. executeYourCommand(parseTokens); >); >);

Я настоятельно рекомендую вам научиться писать чистый и лучший код, а затем изучить компиляцию и синтаксический анализ языка, прежде чем создавать дискорд-бота с командами.

Надеюсь это поможет! (^ ш ^)

Источник: reddeveloper.ru

eval()

Предупреждение: выполнение JavaScript из строки представляет собой огромную угрозу безопасности. Злоумышленнику слишком легко запустить произвольный код, когда вы используете eval() . См. Никогда не использовать eval ()! , ниже.

Функция eval() оценивает код JavaScript, представленный в виде строки, и возвращает его значение завершения. Исходник разбирается как скрипт.

Try it

Syntax

eval(string)

Parameters

Строка, представляющая выражение JavaScript, оператор или последовательность операторов. Выражение может включать переменные и свойства существующих объектов. Он будет проанализирован как скрипт, поэтому объявления import (которые могут существовать только в модулях) не допускаются.

Return value

Значение завершения оценки данного кода. Если значение завершения пусто, возвращается undefined .

Description

eval() — это свойство функции глобального объекта.

Аргумент функции eval() является строкой. Он будет оценивать исходную строку как тело скрипта, что означает, что разрешены как операторы, так и выражения. Он возвращает значение завершения кода. Для выражений это значение, которое оценивается выражением. Многие операторы и объявления также имеют значения завершения, но результат может быть неожиданным (например, значением завершения присваивания является присвоенное значение, но значение завершения let не определено), поэтому рекомендуется не полагаться на операторы. значения завершения.

Существует два режима вызовов eval() :прямой eval и косвенный eval. Прямая функция eval имеет только одну форму: eval( ) (имя вызываемой функции — eval , а ее значение — глобальная функция eval ).Все остальное, включая вызов через переменную с псевдонимом, через доступ к члену или другое выражение, или через необязательную цепочку ?. оператор, является косвенным.

// Косвенный вызов с использованием оператора запятой для возврата eval (0, eval)(‘x + y’); //Косвенный вызов через необязательную цепочку eval?.(‘x + y’); // Косвенный вызов с использованием переменной для хранения и возврата eval const geval = eval; geval(‘x + y’); //Косвенный вызов через доступ к члену const obj = < eval >; obj.eval(‘x + y’);

Косвенную оценку можно рассматривать так, как если бы код оценивался в отдельном . Это означает:

    Косвенная оценка работает в глобальной,а не локальной области видимости,и оцениваемый код не имеет доступа к локальным переменным в той области видимости,в которой он вызывается.
Еще по теме:  Что дают уровни в дискорде

function test( ) < const x = 2, y = 4; // Прямой вызов, использует локальную область видимости console.log(eval(‘x + y’)); // Результат 6 console.

log(eval?.(‘x + y’)); // Использует глобальную область видимости, выбрасывает, потому что x не определен >
function strictContext() < «use strict»; eval?.(`with(Math) console.log(PI);`); > function strictContextStrictEval() < «use strict»; eval?.(`»use strict»; with(Math) console.log(PI);`); > strictContext(); // logs 3.141592653589793 strictContextStrictEval(); //выбрасывает SyntaxError,потому что исходная строка находится в строгом режиме

С другой стороны,прямой eval наследует строгость вызывающего контекста.
function nonStrictContext() < eval(`with(Math) console.log(PI);`); > function strictContext() < «use strict»; eval(`with(Math) console.log(PI);`); > nonStrictContext(); // logs 3.141592653589793 strictContext(); //выбрасывает SyntaxError,потому что он находится в строгом режиме
//Ни контекст,ни исходная строка не являются строгими, //так var создает переменную в окружающей области видимости eval(«var a = 1;»); console.log(a); // 1 //Контекст не является строгим,но источник eval является строгим, //поэтому b привязывается к оцениваемому сценарию eval(«‘use strict’; var b = 1;»); console.log(b); //ReferenceError:b не определено function strictContext() < «use strict»; //Контекст строгий,но это косвенный и источник //строка не является строгой,поэтому c остается глобальной eval?.(«var c = 1;»); //Прямой eval в строгом контексте,поэтому d является скопированным eval(«var d = 1;»); > strictContext(); console.log(c); // 1 console.log(d); //ReferenceError:d не определено
function Ctor() < eval(«console.log(new.target)»); > new Ctor(); //[Функция:Ctor]

В строгом режиме объявление переменной с именем eval или переназначение eval является SyntaxError .

«use strict»; const eval = 1; //SyntaxError:Неожиданные eval или аргументы в строгом режиме

Если аргумент eval() не является строкой, eval() возвращает аргумент без изменений. В следующем примере указан конструктор String , а eval() возвращает объект String , а не оценивает строку.

eval(new String(‘2 + 2’)); // возвращает объект String, содержащий «2 + 2» eval(‘2 + 2’); // возвращает 4

Вы можете обойти это ограничение обычным образом, используя toString() .

const expression = new String(‘2 + 2’); eval(expression.toString()); // возвращает 4

Никогда не используйте eval()!

eval() — опасная функция, которая выполняет переданный ей код с привилегиями вызывающей стороны.

Если вы запустите eval() со строкой, на которую может повлиять злоумышленник, вы можете в конечном итоге запустить вредоносный код на компьютере пользователя с разрешениями вашей веб-страницы/расширения. Что еще более важно, сторонний код может видеть область, в которой был вызван eval() (если это прямой eval), что может привести к возможным атакам способами, которым аналогичная Function не подвержена.

eval() также медленнее, чем альтернативы, поскольку он должен вызывать интерпретатор JavaScript, в то время как многие другие конструкции оптимизированы современными движками JS.

Кроме того, современные интерпретаторы JavaScript преобразуют JavaScript в машинный код. Это означает, что любая концепция именования переменных стирается. Таким образом, любое использование eval() заставит браузер выполнять долгий дорогостоящий поиск имени переменной, чтобы выяснить, где эта переменная существует в машинном коде, и установить ее значение. eval() к этой переменной можно добавить новые вещи, например изменить тип этой переменной, заставив браузер переоценить весь сгенерированный машинный код для компенсации.

К счастью, есть очень хорошая альтернатива eval() : использование конструктора Function . Плохой код с eval() :

Еще по теме:  Как зайти в закрытый канал в discord

function looseJsonParse(obj) < return eval(`($ )`); > console.log(looseJsonParse( «, c:new Date()>» ))

Лучший код без eval() :

function looseJsonParse(obj) < return Function(`»use strict»;return ($ )`)(); > console.log(looseJsonParse( «, c:new Date()>» ))

Может показаться, что два приведенных выше фрагмента кода работают одинаково, но это не так. eval() намного медленнее. Обратите внимание c: new Date() в оцениваемой строке. В функции без eval() объект оценивается в глобальной области видимости, поэтому для браузера безопасно предположить, что Date ссылается на window.Date() вместо локальной переменной с именем Date . Однако в коде, использующем eval() , браузер не может этого предположить. Например, в следующем коде Date в оцениваемой строке не относится к window.Date() .

function Date(n) < return [«Monday»,»Tuesday»,»Wednesday»,»Thursday»,»Friday»,»Saturday»,»Sunday»][n%7 || 0]; > function looseJsonParse(obj) < return eval(`($ )`); > console.log(looseJsonParse( «, c:new Date()>» ))

Таким образом, в версии кода eval() браузер вынужден выполнять дорогостоящий вызов поиска, чтобы проверить, есть ли какие-либо локальные переменные, называемые Date() . Это невероятно неэффективно по сравнению с Function() .

В связи с этим, если вы действительно хотите, чтобы ваша функция Date() вызывалась из кода внутри Function() , должны ли вы просто выбрать простой путь и использовать eval() ? Нет! Никогда. Вместо этого попробуйте подход, описанный ниже.

function Date(n) < return [«Monday»,»Tuesday»,»Wednesday»,»Thursday»,»Friday»,»Saturday»,»Sunday»][n%7 || 0]; > function runCodeWithDateFunction(obj) < return Function(`»use strict»;return ($)`)()( Date ); > console.log(runCodeWithDateFunction( «function(Date)< return Date(5) >» ))

Приведенный выше код может показаться неэффективно медленным из-за тройной вложенной функции,но давайте проанализируем преимущества эффективного метода,приведенного выше:

  • Это позволяет runCodeWithDateFunction() код в строке, переданной в runCodeWithDateFunction () .
  • Накладные расходы на вызов функций минимальны,поэтому гораздо меньший размер кода вполне оправдывает преимущества
  • Function() позволяет вашему коду более легко получить выгоду от возможных улучшений производительности, обеспечиваемых «use strict»;
  • Код не использует eval() , что делает его на порядки быстрее, чем в противном случае.

Наконец, давайте рассмотрим минификацию. Используя Function() как показано выше, вы можете runCodeWithDateFunction() строку кода, переданную в runCodeWithDateFunction (), гораздо более эффективно, потому что имена аргументов функции также могут быть минимизированы, как показано в минимизированном коде ниже.

console.log(Function(‘»use strict»;return(function(a))’)( )(function(a)< return»Monday Tuesday Wednesday Thursday Friday Saturday Sunday».split(» «)[a%7||0]>));

Существуют также дополнительные более безопасные (и более быстрые!) Альтернативы eval() или Function() для распространенных случаев использования.

Разница между eval() и Function() заключается в том, что исходная строка, переданная в Function() , анализируется как тело функции, а не как скрипт. Есть несколько нюансов — например, вы можете использовать операторы return в теле функции, но не в скрипте. Если вы собираетесь анализировать содержимое как сценарий, другой безопасной альтернативой может быть использование косвенной оценки и принудительного строгого режима.

function looseJsonParse(obj) < return eval?.(`’use strict’;($ )`); > console.log(looseJsonParse( «, c:new Date()>» ))

Таким образом,оцениваемый код не имеет доступа к локальной области видимости и не может определять глобальные переменные.

Источник: runebook.dev

Рейтинг
( Пока оценок нет )
Загрузка ...