我正在构建一个小编码游戏。对于这个游戏,每个玩家都提交一个javascript函数。游戏连续多次运行这些功能中的每一个,并且我收集了这些功能返回的值。这些返回值对于游戏而言很重要。因此,如果playerFunc是玩家提交的函数,那么我的游戏可能会执行以下操作:
var values = []
for(var i = 0; i < 1000; i++){
values.push(playerFunc(i))
}
doSomething(values)
问题是,我想防止播放器将数据从一个调用传递到下一个调用。例如,我不希望通过任何方式调用playerFunc来确定是否已经使用参数0对其进行了调用。为此,我认为我需要防止玩家提交的函数访问闭包和全局变量。
我知道我可以通过使用Function构造函数创建每个函数来摆脱闭包,所以我想我已经弄清楚了。我遇到的麻烦是阻止对全局变量的访问。
我可以通过在Web worker中运行每个函数来完全隔离每个函数调用,但是我已经读到,Web worker大约需要40毫秒的时间来设置,而且我可能需要每秒最多运行1000次这些函数,这太慢了。
还有什么其他方法可以阻止函数访问全局变量,或者在每次调用函数后以某种方式重置全局范围?
该游戏目前仅与 friend 一起玩,因此我不担心玩家做任何恶意的事情,但我确实认为他们可能会尝试作弊。
最佳答案
您可以尝试这样的事情:
var createFunction = function(fnBody) {
var f = new Function('obj', 'window', 'document', '"use strict";' + fnBody);
return f.bind({}, {}, {}, {});
}
对
window
或document
的任何访问都将使用参数而不是全局变量。欢迎您添加更多全局变量以限制访问。使用"use strict";
,您将停止提供的函数访问带有 undefined variable 的全局范围。var createFunction = function(fnBody) {
var f = new Function('obj', 'window', 'document', '"use strict";' + fnBody);
return f.bind({}, {}, {}, {});
}
createFunction('window.hello = "test"')();
console.log(window.test); //undefined
createFunction('hello = "test";')(); //throws error
console.log(hello);
这将引发错误。
关于javascript - 如何将函数与全局变量隔离,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32282265/