javascript的节点操作
PHP中文网
PHP中文网 2017-04-10 16:10:19
[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('pap').onclick = function(){
    document.head.getElementsByTagName('script')[0].parentNode.removeChild(document.head.getElementsByTagName('script')[0]);
    console.log(a);    
}

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

PHP中文网
PHP中文网

认证0级讲师

全部回复(2)
PHP中文网

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

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

页面源码里有如下代码

<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

ringa_lee

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号