【问题标题】:Cleaning javascript variable scope by removing it's code from DOM通过从 DOM 中删除它的代码来清理 javascript 变量范围
【发布时间】:2009-04-24 16:27:06
【问题描述】:

希望这个基于 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 代码。

感谢阅读。

【问题讨论】:

    标签: javascript jquery dom


    【解决方案1】:

    这肯定不会像您期望的那样工作。 JavaScript 堆不与 DOM 耦合 - 一旦脚本执行并改变了堆,您就不能通过删除它们的相关源代码来“取消执行”它们。

    全局变量通常设置在窗口对象上,因此如果您知道名称,可以从那里删除它们。如果您想撤消块内任何 JavaScript 的效果,那您就很不走运了。

    【讨论】:

    • 我明白了。那我会尝试其他方法。感谢您的信息!
    • var 声明将使用 DontDelete 属性将属性添加到范围对象(在
    【解决方案2】:

    Javascript 不能那样工作!一旦脚本块被解析,从 DOM 中删除它就不会做任何事情......我唯一能想到的是一个真正的 ugly hack 像这样:

    <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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多