作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我正在构建一个小型编码游戏。对于这个游戏,每个玩家都提交一个 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/
我是一名优秀的程序员,十分优秀!