插入script标签,然后立即移出,为什么里面的代码一定会执行完毕了呢?

下面这段代码插入了一段script代码,然后立即将其移出,那是什么机制保证了移出节点(removeChild函数)前,里面的代码已经执行完毕了呢?

var a = 1,
    code = 'a = 2;',
    doc = document,
    body = doc.body,
    script = doc.createElement('script');
script.innerHTML = code;
body.appendChild(script).parentNode.removeChild(script);
console.log(a);
阅读 2.7k
4 个回答

首先,没有遇见过这种插入之后马上删除的情况,所以我大概说一下我的看法,需要对你有所帮助:
1、这个script是浏览器异步加载的,一般情况下不知道何时加载完,像这种里面就一个a=2;,它的执行力是很快的,解析非常快。不知你是否试过放成百上千条代码进去,还能把所有代码执行完成的情况?

2、从另一个角度来想,我项目有个需求就是要动态创建script标签插入到body中去,如果插入了里面代码不先立即执行一遍,那么不就和没有使用动态插入是一样的。

综上所述,虽然插入之后马上又删除了,且代码是一步执行的,但是这个例子里面代码就一句,而且毕竟appendChild的执行在removeChild的前面,肯定会先开始执行。可以尝试外链一个代码多的js文件或者多添加代码再做尝试,看是否也是全部执行完

关于动态插入script文件的的一些方法链接(来自网络):http://www.cnblogs.com/skykan...

并不是你想的那样立即执行的,这种链式调用是前一个执行完毕,再执行后面的内容比如

var obj={
    a:0,
    parentNode:function(){
    console.log(this.a);
    return this;
    },
    appendChild:function(){
    console.log(this.a);
    return this;
    },
    removeChild:function(){
    console.log(this.a);
    return this;
    }
}

obj.appendChild().parentNode().removeChild();

运行时都是等待上一部执行完成,再进入下一步

javascript是一种弱语言 他没有那么严格 所以他的代码是从上往下读 按逻辑顺序 他是你上一段处理的代码执行完毕 在remove那个操作 但是已经被执行了

运行下代码,就知道是什么样的了

var a = 1,
    code = 'a = 2;var d=100;while(d!=0) { d--;console.log("executing script");console.log(document.getElementById("myScript"));}; console.log("script done");',
    doc = document,
    body = doc.body,
    script = doc.createElement('script');
    script.setAttribute("id","myScript");
script.innerHTML = code;
script=body.appendChild(script);
console.log("append script");
console.log(document.getElementById("myScript"));
script.parentNode.removeChild(script);
console.log("remove script");
console.log(document.getElementById("myScript"));
console.log(a);
推荐问题