在对象变量上调用方法

时间:2014-08-13 14:20:58

标签: javascript jquery global-variables eval global

我猜有关于全局变量的问题。

我有以下代码:

$('span.ion-chevron-left, span.ion-chevron-right').click(function() {

    var myIterator  = $(this).attr('data-iterator');

    ('ion-chevron-right' == $(this).attr('class')) ? window[myIterator].next() : window[myIterator].prev();

    if(!window[myIterator].valid()) {

      (window[myIterator].key() == window[myIterator].getTotal()) ? window[myIterator].rewind() : window[myIterator].end();

    }

    // do something

});

您需要知道变量myIterator包含一个字符串,如'myIterator1','myIterator2','myIterator3'......

正如你所看到的,我想避免冗余。我不想写这样的东西:

if('myIterator1' == myIterator) { ... }
if('myIterator2' == myIterator) { ... }

所以我试图通过编写window [myIterator] .method();

来调用不同迭代器对象上的方法

这是正确的方法吗?我认为可以使用eval,但我认为eval是邪恶的,所以有区别吗?或者如何解决这类问题呢?我目前的代码中是否存在任何安全问题?

祝你好运

1 个答案:

答案 0 :(得分:0)

您的一般方法是合理的,但您应该通过将迭代器放在专用对象中来避免污染全局命名空间。而不是window[myIterator],请使用(例如)iteratorDict[myIterator],其中iteratorDict

定义
var iteratorDict = {
    "myIterator1": ...,
    "myIterator2": ...,
    ...
}

或者,如果您不想同时定义所有这些内容,只需将您的定义var myIterator1 = ...更改为iteratorDict["myIterator1"] = ...