javascript的节点操作

function aa(code){
    
    var script = document.createElement("script");
        script.text = code;
    document.head.appendChild(script);
    //或者在这里直接
    //(或者直接document.head.appendChild( script ).parentNode.removeChild( script );)
}
aa('var a=8');
console.log(a);
document.getElementById('divap').onclick = function(){
    document.head.getElementsByTagName('script')[0].parentNode.removeChild(document.head.getElementsByTagName('script')[0]);
    console.log(a);    
}

输出的a都是8.
javascript是怎么运行的,我添加之后立即删除怎么在script里面定义的变量还存在啊。我以为也会被删除也,有什么比较权威的说法吗?

阅读 3.2k
2 个回答

对于你代码里值得优化的地方我就不说了,不是重点。

那么就针对你的问题来说吧。
其实我可以把你的问题简化一下:

页面源码里有如下代码

<html>
  <head>
    <script>var a = 1;</script>
  </head>
  <body>
    <scipt>
      console.log(a);    // 输出:1
      
      // 删除head里的script标签
      var script = document.head.getElementsByTagName('script')[0];
      script.parentNode.removeChild(script);
      
      console.log(a);    // 输出:1  为什么还能获取到a?
    </script>
  </body>
</html>

问题是不是没变味?那接下来我解释一下

首先你要了解的是,对于页面上的所有脚本,运行了就是运行了,运行期间产生的东西,无论是指针还是对象,依照各自的生命周期,该保留保留,该销毁销毁。所有脚本按照顺序执行完毕后,该什么结果就是什么结果,删除script标签是没有用的,因为你删除的只是一个标签而已,这个script标签里的代码已经加载到内存中了。
那么head里的这个script内的代码:var a = 1;从某种角度来说等价于window.a = 1;。从这句执行了之后,window下就已经有了a属性,并有值为:1
想要删除window.a也只能通过这种方式删除:delete window.a(严格模式不支持delete,相关请自行google)
刚才忘了,window下的属性不能通过delete删除

那么,你是不是懂了呢?
希望可以帮到你 :P

你这个是在对象运行函数aa()之后删除javascript脚本的呀,当你click的时候,早就运行了,这个时候你删除的只是dom节点而已,执行过的函数后产生的变量自然存在。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题