浏览器是否持久缓存脚本元素的编译版本?

时间:2016-05-13 10:24:08

标签: javascript jquery dom

在允许用户使用javascript播放的网络应用中,我要求他们在“程序”中使用function main()。有一个“运行”按钮和一个“编辑”按钮。按“运行”时,<textarea>中的文本用于创建脚本块并将其插入DOM。然后调用main()

我抓住window.onerror向用户显示错误。这通常可行。如果没有main(),则会显示相应的错误消息。

当您按“编辑”时,脚本块将设置为空白(script.text = '';),并从DOM中删除。

测试,我注意到如果我的“程序”只包含:

function main() { printLn('main here'); }

它按预期工作,但当我改为:

function moon() { printLn('moon here'); }

而不是收到一条说main() not defined的消息,它仍然像以前一样工作,尽管脚本块有“月亮”文本。如果我为每个创建的脚本块提供了一个独特的ID,并且在删除之前将脚本块类型更改为text/plain,则会继续发生这种情况。

问题出现在当前的Firefox,Chrome和Opera中。您可以看到here

会发生什么

1 个答案:

答案 0 :(得分:4)

即使您删除了定义它的脚本,函数仍会定义。

这与CSS形成鲜明对比,因为删除或修改样式表会相应地删除或更新页面上的样式。

这是一个很好的理由,那就是CSS可以在进行更改时轻松重新评估。另一方面,JavaScript太复杂了,浏览器无法理解&#34;删除脚本&#34;实际上。

因此,如果您使用main()运行了一个函数,即使您删除它也会继续存在。

我的建议是创建一个运行脚本的闭包。你可以用......之类的东西来做到这一点。

var input = "........"; // user's input
var runner = "if( typeof main === 'undefined') {"+
    "showErrorMessage('No main() defined');"+ // or whatever your error function is
  "} else { main(); }";
var func = new Function("(function() {"+input+runner+"})()");
func();

总是值得注意的是,仍然可以访问全局范围,例如,如果用户忘记了var他们的本地变量,或者他们是否完全访问window.something。只要它只在用户自己的机器上运行,这不是一个问题,但如果人们可以与他人分享他们的代码,那么你需要更加小心