【问题标题】:Executing a string without eval or is eval ok to use here? [duplicate]在没有 eval 的情况下执行字符串或 eval 可以在这里使用吗? [复制]
【发布时间】:2022-02-04 15:04:26
【问题描述】:

是否有更好的方法来执行字符串“getData”而不使用 eval 或 eval 在这种情况下是一个不错的选择,因为正在评估的不是用户生成的?

object.myMainObject(Marcus)

object = {
    Data = {
        Marcus : function(){
            alert('marcus function')
        },
        James : function(){
            alert('james function')
        }
    }

    myMainObject : function(string){
        getData = "object.Data." + string + "()"

        eval(getData)
    }
}

【问题讨论】:

  • 是的。我们每周至少收到一次这个问题。我想知道所有 javascript 初学者都是从哪里来的,以及为什么他们没有在早期教授对象 哈希映射同构这样重要的基础知识......

标签: javascript eval


【解决方案1】:

eval 对于这种情况完全没有必要,只需使用括号符号 来访问动态 命名的属性:

var object = {
    Data : {
        Marcus : function(){
            alert('marcus function');
        },
        James : function(){
            alert('james function');
        }
    }

    myMainObject : function(string){
        var getData = object.Data[string]();
    }
};

object.myMainObject("Marcus"); // 'marcus function'

注意事项:

  • 您定义object 的方式存在一些语法错误(您使用的是=,而不是:)。
  • 您没有使用var 语句来声明objectgetData,请在声明变量时使用var 语句,否则它们最终将成为全局对象的属性。
  • 作为一项安全措施,您可以在调用之前检查正在访问的成员是否实际上是一个函数,例如:

    //...
    var getData;
    if (typeof object.Data[string] == 'function') {
       getData = object.Data[string]();
    }
    //...
    

【讨论】:

    【解决方案2】:

    评估是不行的。

    getData = object.Data[string]()

    【讨论】:

      【解决方案3】:

      是的,有更好的方法。使用square bracket notation 按名称访问对象的属性:

      object.Data[string]();
      

      【讨论】:

        【解决方案4】:

        可以评估它。虽然我真的不明白你想要达到什么目的。

        【讨论】:

        • 评估它是不行的(编辑:虽然不是我的反对意见)。想想string == "x; alert('har har')//"。尤其是因为有一种无需 eval 的方式效果更好,而且实际上更易于打字和阅读。
        • 看来他想通过传入一个作为函数名称的字符串来运行一个函数。 :P
        • 是的,我绝对不明白发生了什么。不过,我会把我的答案留给其他人作为警告!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-12
        • 2022-07-07
        相关资源
        最近更新 更多