通过从DOM中删除它的代码来清理javascript变量范围

时间:2009-04-24 16:27:07

标签: javascript jquery dom

希望这个基于jquery的简单代码能够帮助解释这个问题。

html:

<script> 
  $('#remover').click(function(){
   $('#block').empty();
  })
  $('#test').click(function(){
   alert(remove1);  // still displays the varibale
  })
</script>
<div id="block">  
 <script>
    var remove1 = 'asasdsds';
    var remove2 = 'asasdsds';
    var remove3 = 'assdsdsdas';         
    var blabla = 'blablabl';
 </script>
</div>

<span id="remover">Remove ALL</span>
<span id="test">Test</span>  // it will still displays the variable.

我需要通过删除块内容来清除全局范围内的所有变量。块内容是动态的,可以包含任何javascript代码。

感谢阅读。

2 个答案:

答案 0 :(得分:7)

这肯定不会像你期望的那样有效。 JavaScript堆没有耦合到DOM - 一旦脚本执行了,并且变异了堆,你就不能通过删除它们的相关源代码来“删除”它们。

全局变量通常在窗口对象上设置,因此如果您知道名称,则可以从那里删除它们。如果你想要撤消块内任何JavaScript的效果,那你几乎没有运气。

答案 1 :(得分:4)

Javascript无法正常工作!一旦解析了一个脚本块,从DOM中删除它就不会做任何事情......我唯一能想到的就是像这样的丑陋的黑客

<script>
var blockKeys = [];
var oldKeys = {};
for (var i in window)
    oldKeys[i] = true;
</script>
<div id="block">  
 <script>
    var remove1 = 'asasdsds';
    var remove2 = 'asasdsds';
    var remove3 = 'assdsdsdas';         
    var blabla = 'blablabl';
 </script>
</div>
<script>
for (var i in window)
{
    if (!oldKeys[i])
        blockKeys.push(i);
}
alert(remove1);
</script>

然后你的删除功能如下:

<script>
function remove()
{
    for(var i = 0; i < blockKeys.length; i++)
        eval(blockKeys[i] + ' = null');
}
</script>