【问题标题】:eval template string and class instanceseval 模板字符串和类实例
【发布时间】:2019-10-21 22:23:08
【问题描述】:

在代码重构练习中,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

【问题讨论】:

    标签: javascript arraylist instance eval nodelist


    【解决方案1】:

    为什么要引用?

    "[j]"是${}插入到模板字符串中的String。据我所知,整个${"[j]"} 部分可以替换为[j]。

    “从未使用过手风琴”

    您的 linter 不知道 eval 在运行时会做什么。由于您仅在字符串中使用Accordian,因此实际上并未在您的代码中使用它。

    “评估可能有害”

    eval 是邪恶的。根据插入的tempid 的值,评估的字符串可能包含任意(可能有害的)代码。您可能想使用 tempid 在某个对象上设置属性,例如global[tempid] = new Accordian([j])。这会让 linter 也能看到类的使用情况。

    【讨论】:

    • 我觉得你的 cmets 非常有用,并且从它们中包含 tempid 的对象替换了数组,从而可以摆脱 eval altogehter,但是,使用提取的字符串实例化新类的问题据我所知,与手风琴ID相同的变量名称仍然存在。感谢您的关注。
    • 不,你的 cmets,他们所有人,砰砰作响。在这种情况下,我是在范围界定方面遇到问题的人,因此最终能够通过登录到进行调用的 IFFE 中的控制台来“查看”我的实例。它不一定是一个对象,但是通过这种方式在 REPL 中更容易看到类实例的集合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    相关资源
    最近更新 更多