gpt4 book ai didi

javascript - 运行动态 Javascript 代码

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

我正在制作一个小游戏,其中一部分我想要一种非常简单的自定义编程语言。如果用户输入代码,例如 variable "helloWorld"= 5,“解释器”会将变量更改为 var 并将引号删除为普通 JavaScript。

我应该如何运行该代码?我读过有关 eval() 的内容,但我也读过它很慢,不应该使用。我研究过使用词法分析器、解析器和分词器创建编程语言,但我不打算创建那么深入的东西。

任何指导方面的帮助都会很棒。

最佳答案

我假设您不需要“如何编写代码?”方面的帮助,而是如何执行用户脚本。

关于评估:

  1. eval 很慢吗?是的。慢到什么程度才算慢?如果脚本在 10 毫秒内编译运行,否则在 20 毫秒内运行,这对您和您的应用程序来说是否有问题?
  2. 用户会不会搞砸 eval?是的!他们可以重新分配函数、全局变量等。他们可能会不小心破坏页面。
  3. 有危险吗?是的!您可能容易受到 XSS 攻击。你有任何敏感数据吗?您的应用程序有服务器端吗?如果不是,我认为 eval 可以。

以下是来自不同 SO 问题的更多信息:

关于防止全局重新分配的想法

用 IIFE 包装脚本!像这样包装脚本:

(function(){
// user script goes here. This will cause it to be in it's own scope!
})();

Javascript 具有函数作用域,因此这将防止全局空间被用户变量和函数填满。用户仍然可以像这样恶意影响全局变量:

(function(){Array.isArray = function() { return 2;};})()
Array.isArray([]);
// returns 2

更多关于 eval 速度的信息。一个真实的例子:

#!/bin/env node
// Be careful running this. You don't want to melt your cpu. Try 100,000 first.
console.time("no-eval");
for (var i = 0; i < 10000000; i++) { Math.sqrt(i); }
console.timeEnd("no-eval");
console.time("big-eval");
eval("for (var i = 0; i < 10000000; i++) { Math.sqrt(i); }");
console.timeEnd("big-eval");
console.time("evil-eval");
for (var i = 0; i < 10000000; i++) { eval("Math.sqrt(i);"); }
console.timeEnd("evil-eval");

输出:

no-eval: 272ms
big-eval: 294ms
evil-eval: 1945ms

如您所见,'big-eval' 有点慢。您可能会执行 big-eval,一次运行用户脚本的所有行。 “evil-eval”要慢得多,因为 js 引擎正在运行 eval 10,000,000 次! :)

关于javascript - 运行动态 Javascript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22340975/

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