Javascript中跨多个文件的全局变量

IT技术 javascript scope global-variables global
2021-01-29 02:01:14

我的一些 JavaScript 代码位于名为 helpers.js 的外部文件中。在调用此 JavaScript 代码的 HTML 中,我发现自己需要知道 helpers.js 中的某个函数是否已被调用。

我试图通过定义来创建一个全局变量:

var myFunctionTag = true;

在我的 HTML 代码和 helpers.js 中的全局范围内。

我的 html 代码如下所示:

<html>
...
<script type='text/javascript' src='js/helpers.js'></script>    
...
<script>
  var myFunctionTag = false;
  ...
  //I try to use myFunctionTag here but it is always false, even though it has been se t to 'true' in helpers.js
</script>

我正在尝试做的甚至可行吗?

6个回答

您需要在包含 helpers.js 文件之前声明该变量。只需在 helpers.js 的包含上方创建一个脚本标记并在那里定义它。

<script type='text/javascript' > 
  var myFunctionTag = false; 
</script>
<script type='text/javascript' src='js/helpers.js'></script>     
... 
<script type='text/javascript' > 
  // rest of your code, which may depend on helpers.js
</script>
对我不起作用,因为当尝试从另一个 html 中加载的另一个 js 访问时,它说该变量未声明
2021-04-06 02:01:14

该变量可以在.js文件中声明并在 HTML 文件中简单地引用。我的版本helpers.js

var myFunctionWasCalled = false;

function doFoo()
{
    if (!myFunctionWasCalled) {
        alert("doFoo called for the very first time!");
        myFunctionWasCalled = true;
    }
    else {
        alert("doFoo called again");
    }
}

还有一个页面来测试它:

<html>
<head>
<title>Test Page</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script type="text/javascript" src="helpers.js"></script>
</head>

<body>


<p>myFunctionWasCalled is
<script type="text/javascript">document.write(myFunctionWasCalled);</script>
</p>

<script type="text/javascript">doFoo();</script>

<p>Some stuff in between</p>

<script type="text/javascript">doFoo();</script>

<p>myFunctionWasCalled is
<script type="text/javascript">document.write(myFunctionWasCalled);</script>
</p>

</body>
</html>

您将看到测试alert()将显示两种不同的内容,并且第二次写入页面的值将有所不同。

好的,伙计们,这也是我的小测试。我遇到了类似的问题,所以我决定测试 3 种情况:

  1. 一个 HTML 文件,一个外部 JS 文件......它真的有效吗 - 函数可以通过全局变量进行通信吗?
  2. 两个 HTML 文件、一个外部 JS 文件、一个浏览器、两个选项卡:它们会通过全局变量进行干扰吗?
  3. 一个 HTML 文件,由 2 个浏览器打开,它会工作吗?它们会干扰吗?

所有的结果都符合预期。

  1. 有用。函数 f1() 和 f2() 通过全局 var 进行通信(var 在外部 JS 文件中,而不是在 HTML 文件中)。
  2. 他们不干涉。显然,每个浏览器选项卡、每个 HTML 页面都制作了不同的 JS 文件副本。
  3. 正如预期的那样,所有工作都独立工作。

与其浏览教程,我发现试用起来更容易,所以我就这样做了。我的结论是:每当您在 HTML 页面中包含外部 JS 文件时,外部 JS 的内容都会在页面呈现之前“复制/粘贴”到您的 HTML 页面中。或者,如果您愿意,也可以进入您的 PHP 页面。如果我在这里错了,请纠正我。谢谢。

我的示例文件如下:

外部JS:

var global = 0;

function f1()
{
    alert('fired: f1');
    global = 1;
    alert('global changed to 1');
}

function f2()
{
    alert('fired f2');
    alert('value of global: '+global);
}

HTML 1:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript" src="external.js"></script>
<title>External JS Globals - index.php</title>
</head>
<body>
<button type="button" id="button1" onclick="f1();"> fire f1 </button>
<br />
<button type="button" id="button2" onclick="f2();"> fire f2 </button>
<br />
</body>
</html>

HTML 2

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<script type="text/javascript" src="external.js"></script>
<title>External JS Globals - index2.php</title>
</head>
<body>
<button type="button" id="button1" onclick="f1();"> fire f1 </button>
<br />
<button type="button" id="button2" onclick="f2();"> fire f2 </button>
<br />
</body>
</html>
HTML 1 和 HTML 2 是相同的(除了页面标题)...不过,我制作了两个文件,只是为了让它们在物理上分开。
2021-04-07 02:01:14

嗨,将值从一个 js 文件传递​​到另一个 js 文件,我们可以使用本地存储概念

<body>
<script src="two.js"></script>
<script src="three.js"></script>
<button onclick="myFunction()">Click me</button>
<p id="demo"></p>
</body>

二.js文件

function myFunction() {
var test =localStorage.name;

 alert(test);
}

三.js文件

localStorage.name = 1;

//Javascript文件1

localStorage.setItem('Data',10);

//Javascript文件2

var number=localStorage.getItem('Data');

不要忘记在 html 中链接您的 JS 文件:)