代码之家  ›  专栏  ›  技术社区  ›  Sinan

如何以对象形式传递eval中的参数?

  •  6
  • Sinan  · 技术社区  · 15 年前

    我有这个JSON,当我得到这个JSON时,我需要运行回调对象中的函数。

    {
        formId: 'snn_service_item_form',
        item_id: '1',
        item_title: 'some item',
        item_description: '',
        item_duration: '10',
        item_price: '120',
        item_level_1 : 1,
        item_level_2 : 0,
        item_level_3 : 1,
        item_type: 'p',
        callback : {
            callbackName : 'getServices',
            callbackParams : {
                _param1 : 1,
                _param2 : 2 
        } 
    } 
    }
    

    所以根据这个,我需要运行这个:

    getServices(1,2);
    

    我可以用eval函数来实现,比如:

    eval(json.callback.callbackName+'(\''+ json.callback.callbackNParams._param1 +'\',\''+ json.callback.callbackNParams._param2 +'\')');
    

    我可以通过将其放入for-in并将参数写入字符串来实现自动化,但我认为这不是最好的方法。

    在我的例子中,有没有一种方法可以从var中分配函数名,并将其参数作为一个对象给出,比如:

    json.callback.callbackName(json.callback.callbackParams);
    

    我知道这不是解决问题的方法,但这是我想学的。

    谢谢,锡南。

    2 回复  |  直到 15 年前
        1
  •  12
  •   Crescent Fresh    15 年前

    取决于要调用的函数的定义位置(全局作用域或本地作用域)。

    如果是全球性的,你不需要 eval (避免它更安全),您只需通过全局 window 对象:

    var args = [];
    for(var p in json.callback.callbackParams) {
        args.push(json.callback.callbackParams[p]);
    }
    window[json.callback.callbackName].apply(null, args)
    

    apply() function 以上使用。

    如果它在本地范围内,那么您需要 埃瓦 (你的情况很好)。

        2
  •  2
  •   bobince    15 年前

    不要使用eval。您可以从 window 对象:

    var callbackfunction= window[json.callback.callbackName];
    

    试图将您的值序列化为一个字符串,只是为了让它们不可靠地解析回JavaScript,这是愚蠢的。显式调用函数:

    callbackfunction.call(window, json.callback.callbackParams.param1, json.callback.callbackParams.param2);
    

    ( 窗口 这是一个虚拟值 this 当您不使用对象方法时。)

    更好的方法是自动接受任意数量的参数,将callbackParam转换为普通数组:

    callbackParams: [1, 2]
    

    然后使用 apply 调用函数:

    callbackfunction.apply(window, json.callback.callbackParams);