gpt4 book ai didi

javascript - 如何将函数与全局变量隔离

转载 作者:数据小太阳 更新时间:2023-10-29 04:50:58 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com