【问题标题】:Unable to update a variable via the eval() function无法通过 eval() 函数更新变量
【发布时间】:2014-05-25 22:46:53
【问题描述】:

我会尽量说清楚。我在 Javascript 中有一个 DVD 对象。它具有分配给它的一小部分属性。我希望能够通过传递属性名称而不是为每个不同的属性设置一个函数来更改这些值,但我似乎无法完成它,我很确定这是因为我不是对 eval() 函数足够熟悉。

这是我正在使用的代码:

function DVDItem()
{
    var Properties = { 
              DVDShortName: "",  
              HasActivationKey: true, 
              NetInstFolderName: "", 
              AddTitlesCheck: true, 
              LocalTestCheck: true, } 

    this.updateProperty = function(propertyName, propertyValue)
    {
        var specificProperty = eval("Properties." + propertyName);
        specificProperty = propertyValue;
    }
}

这样我就可以声明一个对象并改变它的属性:

var DVD1 = new DVDItem();
DVD1.updateProperty("HasActivationkey", false);

但我没有正确地做某事,因为这不起作用。 有什么想法吗?

谢谢

【问题讨论】:

  • I'm not familiar enough with the eval() function 算了,它不存在
  • 使用Properties[propertyName]
  • eval() 被贬低了,还是不应该使用?
  • 因为很危险
  • 可能会发生意想不到的事情;真的)

标签: javascript oop


【解决方案1】:

在这种情况下您不需要使用eval
你可以简单地得到你想要的:

Properties[propertyName]

阅读这篇关于 eval 的文章:Why I Should not using it?

【讨论】:

    【解决方案2】:

    试试这个:

    function DVDItem() {
        var Properties = { 
            DVDShortName: "",  
            HasActivationKey: true, 
            NetInstFolderName: "", 
            AddTitlesCheck: true, 
            LocalTestCheck: true, 
        } 
    
        this.updateProperty = function(propertyName, propertyValue) {
            Properties[propertyName] = propertyValue;
        }
    }
    

    通常的约定是让 getter 和 setter 函数相同,如下所示:

    function DVDItem() {
        var attrs = {
            DVDShortName: "",
            HasActivationKey: true,
            NetInstFolderName: "",
            AddTitlesCheck: true,
            LocalTestCheck: true
        }
    
        this.attr = function(key, value) {
            if(value !== undefined){
                return this.attrs[key] = value;
            }else{
                return this.attrs[key];
            }
        }
    }
    

    至于 eval(),这是 MDN 文档中的内容:

    eval() 是一个危险的函数,它执行它传递的代码 具有调用者的特权。如果您使用字符串运行 eval() 可能会受到恶意方的影响,您最终可能会运行 具有您的权限的用户计算机上的恶意代码 网页/扩展。更重要的是,第三方代码可以看到 调用 eval() 的范围,这可能导致可能的攻击 以类似功能不易受影响的方式。

    eval() 通常也比替代方法慢,因为它必须 调用 JS 解释器,同时优化许多其他结构 通过现代 JS 引擎。

    对于常见的 eval() 有安全(而且快速!)的替代方法 用例。

    阅读更多here

    【讨论】:

    • 感谢您提供有关 eval() 函数的额外信息!
    • “绝大多数的 [eval] 被大多数 JavaScript 程序员轻描淡写、误用和彻底谴责,但是通过查看一些最好的编码人员的工作,你可以看到,如果使用得当 [它] 可以创造一些奇妙的代码片段,否则不可能” - John Resig 在 JavaScript Ninja 的秘密中
    • 它被谴责,因为它可能导致意外行为,贯穿解释器,并使调试过程复杂化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多