如何避免在以下jquery.timer.js的第10行中使用eval?
摆脱eval的原因是因为我的网站正在转向CSP并且现在需要'unsafe-eval'。
对于这个用例,可能还有eval()的替代方法。
我有点卡住了。非常感谢任何帮助。
;
(function($) {
$.timer = function(func, time, autostart) {
this.set = function(func, time, autostart) {
this.init = true;
if (typeof func == 'object') {
var paramList = ['autostart', 'time'];
for (var arg in paramList) {
if (func[paramList[arg]] != undefined) {
eval(paramList[arg] + " = func[paramList[arg]]");
}
};
func = func.action;
}
if (typeof func == 'function') {
this.action = func;
}
if (!isNaN(time)) {
this.intervalTime = time;
}
if (autostart && !this.isActive) {
this.isActive = true;
this.setTimer();
}
return this;
};
(...)
this.setTimer = function(time) {
var timer = this;
if (typeof this.action != 'function') {
return;
}
if (isNaN(time)) {
time = this.intervalTime;
}
this.remaining = time;
this.last = new Date();
this.clearTimer();
this.timeoutObject = window.setTimeout(function() {
timer.go();
}, time);
};
this.go = function() {
if (this.isActive) {
this.action();
this.setTimer();
}
};
if (this.init) {
return new $.timer(func, time, autostart);
} else {
this.set(func, time, autostart);
return this;
}
};
})(jQuery);
答案 0 :(得分:1)
如果paramList
很大,那么虽然费力和容易出错,但您可以手动设置变量值,因为paramList
不是动态创建的。
对于autostart
和time
,您将使用以下内容:
if(func['autostart'] != undefined) {
autostart = func['autostart'];
}
if(func['time'] != undefined) {
time = func['time'];
}
请注意,此解决方案完全依赖于您事先知道paramList
的内容这一事实。
在您提供的代码的上下文中,您可以像这样修改this.set
:
this.set = function(func, time, autostart) {
this.init = true;
if (typeof func == 'object') {
/* Modified Code */
if(func['autostart'] != undefined) {
autostart = func['autostart'];
}
if(func['time'] != undefined) {
time = func['time'];
}
/* End Modified Code */
func = func.action;
}
if (typeof func == 'function') {
this.action = func;
}
if (!isNaN(time)) {
this.intervalTime = time;
}
if (autostart && !this.isActive) {
this.isActive = true;
this.setTimer();
}
return this;
};