如何将函数与全局变量隔离开来

时间:2015-08-29 02:56:14

标签: javascript

我正在构建一个小编码游戏。对于这个游戏,每个玩家提交一个JavaScript功能。游戏连续多次运行这些函数中的每一个,并且我收集函数返回的值。这些返回值对于游戏来说是重要的。因此,如果playerFunc是玩家提交的功能,我的游戏可能会做这样的事情:

 var values = []
 for(var i = 0; i < 1000; i++){
   values.push(playerFunc(i))
 }
 doSomething(values)

问题是,我想阻止玩家将数据从一个调用传递到下一个调用。例如,我不希望有任何方式调用playerFunc来确定它是否已经使用参数0调用。为此,我想我需要阻止玩家提交的函数访问闭包和全局变量。

我知道我可以通过使用Function构造函数创建每个函数来摆脱闭包,所以我想我已经弄明白了。阻止访问全局变量是我遇到的问题。

我可以通过在web worker中运行它来完全隔离每个函数调用,但我已经读过Web工作者需要大约40ms来设置,我可能需要每秒运行这些函数1000次,所以这是慢下来。

有没有其他方法可以阻止函数访问全局变量,或者在每次函数调用后以某种方式重置全局范围?

此游戏目前只与朋友一起玩,所以我并不担心玩家做恶意事件,但我认为他们可能会试图作弊。

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情:

var createFunction = function(fnBody) {
  var f = new Function('obj', 'window', 'document', '"use strict";' + fnBody);
  return f.bind({}, {}, {}, {});
}

windowdocument的任何访问都将使用参数而不是全局变量。欢迎您添加更多全局变量来限制访问。使用"use strict";,您将使用未定义的变量停止提供的函数访问全局作用域。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

这会引发错误。