eval шаблон строки и экземпляры классов - PullRequest
1 голос
/ 06 июня 2019

Во время упражнения по рефакторингу кода eval () был запущен для анализа строки шаблона и создания экземпляра класса. Рабочий код связан с ниже.

 eval(`let ${tempid} = new Accordian(${"[j]"})`)

Почему эта строка нуждается в кавычках вокруг объекта, на который ссылается [j], для работы?

Мой другой вопрос касается экземпляров классов, и были ли они созданы?

Итак, переменная tempid должна быть строкой, извлеченной из nodeList, но ошибка, которую я получаю, похоже, предполагает иное, несмотря на то, что код запускается, что, на мой взгляд, не будет работать, если только фактически создал новый класс для каждого из объектов аккордеона, выделенных как уникальные из разметки.

Были ли созданы два новых экземпляра класса?

Я получаю следующие ошибки:

 'Accordian' is defined but never used. (no-unused-vars) eslint

 'use strict' is unnecessary inside of modules. (strict) eslint

 eval can be harmful. (no-eval) eslint

https://codesandbox.io/embed/eager-morning-9s5ti?fontsize=14

Edit eager-morning-9s5ti

1 Ответ

2 голосов
/ 06 июня 2019

Почему цитаты?

"[j]" - это строка, вставленная в строку шаблона с помощью ${ }. Насколько я могу судить, всю ${"[j]"} часть можно просто заменить на [j].

«Аккордеон никогда не использовал»

Ваш линтер не знает, что eval будет делать во время выполнения. Поскольку вы используете только Accordian в строке, он фактически не используется в вашем коде.

"Эвал может быть вредным"

eval это зло. В зависимости от значения вставленного tempid вычисляемая строка может содержать произвольный (потенциально опасный) код. Возможно, вы захотите использовать tempid для установки атрибута для какого-либо объекта, например, global[tempid] = new Accordian([j]). Это позволило бы линтеру увидеть использование класса.

...