我正在构建一个小编码游戏。对于这个游戏,每个玩家都提交一个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({}, {}, {}, {});
}

windowdocument的任何访问都将使用参数而不是全局变量。欢迎您添加更多全局变量以限制访问。使用"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/

10-11 23:57
查看更多