所以我正在尝试创建一个在页面加载时生成随机名称的函数,但是我在以后调用该方法时遇到了问题。 这是我到目前为止所得到的:
var methodName = Math.floor(Math.random()*1000001);
window[methodName] = function(){
alert("It works!");
}
window.onload = function start() {
methodName();
}
但我在调用它时遇到问题,因为methodName();
实际上是一个随机数。那么如何调用methodName()
函数?
答案 0 :(得分:3)
您可以使用与设置相同的方式引用该属性:
window[methodName]();
答案 1 :(得分:2)
如果您出于安全原因尝试创建一个在页面后面加载的代码无法找到的函数,您应该知道默认情况下窗口的属性是可枚举的,并且JavaScript的PRNG不是加密的
@MikeSamuel这正是我想要做的。
如果你有一个加密的强大随机源,那么你可以使用锁和钥匙的方法来制作一个只能由知道这个秘密的人调用的函数。
例如,
(function () {
// Multiple calls to a secure source of randomness could get you more entropy than 64B.
var key = Math.random() + '/' + Math.random() + '/' + Math.random();
var sensitiveFunction = function () { alert("Don't leak me"); }
var slice = [].slice;
function lock(f) {
var g = f;
f = null; // arguments is widgy and leaky in non-strict mode.
return function (unlocker, var_args) {
if (key !== unlocker) { throw new Error(); }
return g.call(this, slice.apply(arguments, 1));
};
}
myGlobal = lock(sensitiveFunction);
})();
使用秘密将函数包装在toString()
不返回敏感代码的函数中,并且只能通过可以读取var key
的代码调用。
Is Math.random() cryptographically secure?讨论Math.random
的一些替代方法,用于JavaScript中的强大nonce,但我没有任何个人经验。
除非您可以将key
从此闭包中获取到需要它的代码,否则这实际上并不实用,因此您需要拥有该代码的安全通信通道。您可能还希望有任何定义此脚本的脚本通过<script>
元素并从DOM中删除它们的文本内容,以便无法以这种方式读取敏感函数的主体。
我相信像waterken这样的一些框架使用URL片段为Web应用程序添加秘密,然后在页面中使用这样的技术来防止它们被窥探。
请注意,使具有不可预测名称的属性不可枚举不会保护它们。
在EcmaScript 5中,getOwnPropertyNames
不尊重可枚举性。获得真正无法枚举的属性的唯一标准方法是使用弱映射和密切保持的对象令牌,并且必须等待EcmaScript 6在实际规范中,尽管浏览器供应商正在推测实施大量ES6。