Javascript中的JSONP:立即删除脚本DOM元素

Javascript中的JSONP:立即删除脚本DOM元素,javascript,dom,jsonp,Javascript,Dom,Jsonp,以下经典函数中的DOM/Javascript流中有一点我不理解,它动态构建脚本DOM元素,以便在注入的脚本中提供JSONP请求: function requestServerCall(url) { //Construct the script tag at Runtime var head = document.head; var script = document.createElement("script"); script.setAttribute("src", u

以下经典函数中的DOM/Javascript流中有一点我不理解,它动态构建脚本DOM元素,以便在注入的脚本中提供JSONP请求:

function requestServerCall(url) { //Construct the script tag at Runtime  
  var head = document.head;  
  var script = document.createElement("script");  
  script.setAttribute("src", url);  
  head.appendChild(script);  
  head.removeChild(script); // remove the script tag once inserted to avoid memory consumption  
}  
我不明白的是:这个函数会立即从DOM中删除脚本子项。这是否意味着附加子函数时函数挂起?我想不是。因此,这意味着DOM将记住在通过注入url的HTTP请求完成子项插入后删除子项

直观地说,我认为这是回调的工作(在本例中嵌入在url中的回调)来销毁脚本(或者是计时器回调,因为我们无法保证在失败的情况下会调用回调)


有人能详细介绍一下Javascript/DOM执行流程吗?它可以证明在DOM中“早期”删除子项是正确的吗?

script
元素添加到DOM中会立即通知浏览器获取脚本,一旦获取脚本,就执行它<代码>追加子项在发生这种情况时不会阻塞

浏览器不会“记住”稍后执行
removeChild
,它会立即执行。但是从DOM中删除
script
元素并不能停止获取和运行脚本的过程;已经开始了

因此,立即添加和删除就可以了


我有点偏执,我总是在我的目标浏览器上测试,以防实现出现异常。

谢谢。这完全回答了我的问题,最后一句话很有用:一些浏览器的行为可能有点不同,我们必须谨慎……所以我试着更深入地思考这到底是如何工作的。在我看来,在removeChild调用之后,我们在JS中创建的“script”元素将由DOM(或任何管理它的东西)进行垃圾收集。但是,它所涉及的http请求(包括它嵌入到应答内容中的回调操作)将执行,并维护对此元素的引用,并且只有在回调完成后,才会删除最后一个引用,从而使垃圾收集器能够对该元素进行操作。幸运的是…@Djee:加载脚本并执行脚本的代码肯定会引用
脚本
元素(因此可以触发
加载
错误
事件),但我不认为这就是为什么事情会继续下去。我认为,当调用
removeChild
时,浏览器已经承诺加载和运行脚本,
script
元素已经准备就绪。