我刚做了一些测试,以确定是否可以通过document.write包含的外部脚本更改全局变量。我确实希望这是可能的 - 但它不是!有人对此有解释吗?
调查结果:
通过以下方式更新全局变量:
首先完成原始脚本标记 - 然后通过document.write添加的脚本按插入顺序执行。
另一方面,使用javascript执行的结果通过document.write写入的内容以正确的顺序插入(deepth-first) - 但是仍然使用脚本执行时定义的值。
在外部文件的末尾添加警报(x)会导致修改后的值传播回一个和基本上下文。但如果没有用户互动,似乎无法触发这一点。
测试设置
我的测试如下:从base.html的内联脚本我使用document.write包含一个javascript one.js,它本身包含文件two.js.每个文件通过控制台和document.write输出值并设置值。
来自 base.html 的内联脚本片段
var x = "base";
console.log("x at start base: "+x);
document.write("<p>x at start base "+x+"</p>")
document.write('<scr'+'ipt type=\"text/javascript\" src=\"one.js\"></scri'+'pt>');
document.write("<p>x at end base: "+x+"</p>");
console.log("x at end base: "+x);
档案 one.js
console.log("Start One: "+x);
document.write("<p>Start One "+x+"</p>");
x = "1";
document.write('<scr'+'ipt type=\"text/javascript\" src=\"two.js\"></scri'+'pt>');
document.write("<p>End One "+x+"</p>");
console.log("End One: "+x);
档案 two.js
console.log("x at start two.js: "+x);
document.write("x at start two.js: "+x);
x = "2";
document.write("<p>x at end two.js: "+x+"</p>");
console.log("x at end two.js: "+x);
结果
控制台输出:
x at start base: base
x at end base: base
x at start one.js: base
x at end one.js: 1
x at start two.js: 1
x at end two.js: 2
页面输出:显示正确的顺序,但错误的值(文件2中的2个设置.js不支持one.js的结尾和基础js的结尾。
x at start base: base
x at start one.js: base
x at start two.js: 1
x at end two.js: 2
x at end one.js: 1
x at end base: base
先谢谢 Cotopax