为了账号安全,请及时绑定邮箱和手机立即绑定

我们可以在浏览器会话中跨网页引用JavaScript变量吗?

/ 猿问

我们可以在浏览器会话中跨网页引用JavaScript变量吗?

白衣非少年 2019-12-06 15:35:13

遍历JavaScript的w3schools教程,内容如下:


全局变量具有全局范围:网页上的所有脚本和功能都可以访问它。


因此,我的查询是,我们是否可以引用在特定网页中声明的变量?


例如,在C语言中,我们有extern关键字,通过它可以访问在另一个文件中声明的变量,但可以在文件中引用它。


例如:


在fileA.html的脚本标签内部,我们在var x = 50外部function()声明了,因此它是全局wrt fileA.html。如果我有fileB.html,我们可以从fileB.html中包含的脚本标记中引用x吗?


需要明确的是,这不是在网页之间重用JavaScript文件的情况。


查看完整描述

3 回答

?
PIPIONE

您可以使用Web Workers;MessageChannel请参阅如何从另一个iFrame清除iFrame的内容;或window.postMessage()在浏览上下文之间传递或传递变量。


一种利用方法 SharedWorker


fileA.html


<!DOCTYPE html>

<html>

  <head>

    <script src="scriptA.js"></script>

  </head>

  <body>

    <a href="fileB.html" target="_blank">fileB</a>

  </body>

</html>

scriptA.js


var x = 50, p;


var worker = new SharedWorker("worker.js");


worker.port.addEventListener("message", function(e) {

  alert(e.data);

  if (!p) {

    p = document.createElement("p");

    p.innerHTML = e.data;

    document.body.appendChild(p)

  }

}, false);


worker.port.start();


console.log("Calling the worker from fileA")


worker.port.postMessage(x); // post `50` to worker

fileB.html


<!DOCTYPE html>

<html>

  <head>

    <link rel="stylesheet" href="style.css">

    <script src="scriptB.js"></script>

  </head>

  <body>

  </body>

</html>

scriptB.js


var x, p;

var worker = new SharedWorker("worker.js");

worker.port.addEventListener("message", function(e) {  

  if (!x && !p) {

    x = e.data; // at `connections`:`1` : `e.data`:`50`

    p = document.createElement("p");

    p.innerHTML = "Message from fileA:" + x;

    document.body.appendChild(p)

  }

}, false);  

worker.port.start();  

console.log("Calling the worker from fileB");

worker.port.postMessage("");

worker.js


self.x = null, connections = 0;


onconnect = function(e) {

  var port = e.ports[0];

  ++connections;

  port.addEventListener("message", function(e) {

    if (!self.x) {

      self.x = e.data;

      port.postMessage("Received:" + self.x 

                       + " from fileA, total connections:" 

                       + connections);

    } else {

      port.postMessage("fileB received:" + self.x 

                       + " total connections:" 

                       + connections);

    }

  });

  port.start();

}


查看完整回答
反对 回复 2019-12-06
?
慕慕0277861

哈哈,不。 ;)

当浏览器离开某个页面时,在加载下一页之前,将完全卸载全局范围和所有脚本。

允许一个页面访问另一页面的变量将是一个巨大的安全漏洞。


查看完整回答
反对 回复 2019-12-06
?
慕仰8121524

“全局”是指在声明它们的特定脚本中是全局的。一旦脚本执行完毕,它们就会与cookie以外的所有其他变量一起销毁。

您可以通过Cookie来完成您正在谈论的事情(在网页之间传递值)。它们存储在用户计算机上,除非明确销毁或已过期,否则它们不会被销毁。


查看完整回答
反对 回复 2019-12-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信