我只是做了一些测试,看看是否可以从通过 document.write 包含的外部脚本更改全局变量。我确实期望这是可能的——但事实并非如此!有人对此有解释吗?
发现:
通过以下方式更新全局变量:
- 通过 document.write 包含的外部脚本对包含脚本不可见
- 通过 document.write 包含的内联脚本对包含脚本变得可见
首先原始脚本标签完成 - 然后通过 document.write 添加的脚本按插入顺序执行。
另一方面,使用 javascript 执行结果通过 document.write 编写的内容以正确的顺序(深度优先)插入 - 但仍然使用脚本执行时定义的值。
在外部文件的末尾添加一个 alert(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);
文件一.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);
文件二.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
页面输出:显示正确的顺序但具有错误的值(文件 two.js 中设置的 2 未传播到 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