我猜有关于全局变量的问题。
我有以下代码:
$('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是邪恶的,所以有区别吗?或者如何解决这类问题呢?我目前的代码中是否存在任何安全问题?
祝你好运
答案 0 :(得分:0)
您的一般方法是合理的,但您应该通过将迭代器放在专用对象中来避免污染全局命名空间。而不是window[myIterator]
,请使用(例如)iteratorDict[myIterator]
,其中iteratorDict
由
var iteratorDict = {
"myIterator1": ...,
"myIterator2": ...,
...
}
或者,如果您不想同时定义所有这些内容,只需将您的定义var myIterator1 = ...
更改为iteratorDict["myIterator1"] = ...