1

我只是做了一些测试,看看是否可以从通过 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

4

0 回答 0