我使用以下脚本动态的加载脚本:
    oScript = document.createElement("script");
    oScript.language = "javascript";
    oScript.type = "text/javascript";
    oScript.id = "test";
    oScript.defer = true;
    oScript.text = "function aa() {alert(1);}";
    document.appendChild(oScript);这时脚本可以加载,也就是函数aa可以调用,但是我执行了document.removeChild(oScript);以后用IE Develop Toolbar可以看到脚本DOM对象确实已经删除,但是函数aa依然可以调用,这是怎么回事?

解决方案 »

  1.   

    变量和DOM不在同一存储空间无依赖性。
      

  2.   

    楼上高手说的对我给你想到下面的方法,可以解决你的问题
    <html>
    <HEAD>
    <script type="text/javascript">

        oScript = document.createElement("script"); 
        oScript.language = "javascript"; 
        oScript.type = "text/javascript"; 
        oScript.id = "test"; 
        oScript.defer = true; 
        oScript.text = "function aa() {alert(1);}"; 
        document.getElementsByTagName("HEAD").item(0).appendChild(oScript); 
        
        function remove(){
        oScript.text = "function aa() {}"; 
        document.getElementsByTagName("HEAD").item(0).appendChild(oScript); 
        }
    </script> 
    </HEAD>
    <body>
    <button onclick="javascript:remove();">remove</button>
    <button onclick="javascript:aa();">alert1</button>
    </body>
    </html>
      

  3.   

    楼上是通过将函数置空的方法来解决吗?这是不可取的,因为我事先并不知道动态脚本的具体内容,有可能是从一个url下载来的,我怎么去把一个个函数置空,再说置空就能保证和后续的脚本中的函数不会发生冲突吗?
      

  4.   

    使用匿名函数执行就解决这类问题了。
    (function() {
        var a = 1;
        var b = 2;
        alert(a + b);
    })();a和b都是局部变量,代码执行完,资源就释放了。如果放到全局中,必然要留下内存垃圾var a = 1;
    var b = 2;
    alert(a + b);
      

  5.   

    <html>
    <head>
    <script type="text/javascript">
    function append(){
    var oScript = document.createElement("script"); 
    oScript.type = "text/javascript"; 
    oScript.id = "test"; 
    oScript.defer = true; 
    oScript.text = "aa=function() {alert(1);}"; 
    document.getElementsByTagName("head")[0].appendChild(oScript); 
    }

    function remove(){
    try {
    document.getElementsByTagName("head")[0].removeChild(document.getElementById("test"));
    }catch(e){
    alert(e);
    };
    try {
    delete aa;
    }catch(e){
    alert(e);
    };
    }
    </script> 
    </head>
    <body>
    <button id="append" onClick="javascript:append();">加载</button>
    <button id="remove" onClick="javascript:remove();">卸载</button>
    <button id="run" onClick="javascript:try {aa()} catch (e){alert(e)};">alert1</button>
        </body>
    </html>
      

  6.   

    楼上的方法是删除一个函数变量,但是我要加载的脚本我无法知道里面声明了多少函数和全局变量,我怎么去删除啊,我的脚本一般是由用户指定的一个URL,真是加载容易,卸载难啊,难道js大师们当初只考虑加载而没有考虑卸载的问题吗?