嵌套在对象中的函数的eval的替代方法是什么?

时间:2014-01-16 17:57:20

标签: javascript

我将一些函数名称存储为字符串,然后稍后使用它们进行调用。我熟悉这种模式:

window[myStringName]();

但是,如果我要调用的函数没有直接全局公开,则这不起作用。我试图保持命名空间,并且只为整个脚本公开了1个全局变量。所以问题是,如何在不使用eval的情况下调用这些内部函数?

var myFunc = (function(myFunc){
    myFunc.myInnerFunc = function(){
        alert('hi');
    };
    myFunc.myObj = {
        innerObjFunc: function(){
            alert('howdy');
        }
    };

    return myFunc;
}(myFunc || {}));

或者使用eval有任何缺点吗?我的印象是eval是邪恶的,不应该使用,否则Douglas Crockford会在我的袜子里留下一块煤。

这是我要拆分字符串然后以某种方式聪明地建立电话的地方,但我不确定如何......

http://jsfiddle.net/colbycallahan/AZuUk/

1 个答案:

答案 0 :(得分:0)

这最终是我决定做的。使用类似于@nderscore建议的对象数组。除了我将对象的索引存储在我的html元素的data-action中。比我想象的更容易展示。

HTML:

<div id="pretendBox"></div>

JS:

var myOptions,    
    myObj;

myObj = (function(myObj){
    myObj.myFunc = function(msg){
        alert(msg);
    };

    return myObj;
}(myObj || {}));

myOptions = [
    {        
        action: myObj.myFunc
    }
];

$.each(myOptions, function(index, value){
    $('#pretendBox').append('<div data-action="'+index+'" class="anOption">An Option</div>');
});

$(document).on('click', '.anOption', function(){
    myOptions[Number($(this).attr('data-action'), 10)].action('hi');
});

http://jsfiddle.net/colbycallahan/zTRcw/2/