JavaScript:两个单独的脚本-共享变量?

问题描述 投票:24回答:5

如果我在带有JavaScript的HTML页面中有两个单独的脚本,那么整个页面之间是否共享变量?还是仅在自己的声明中?

示例:

<script> var title = "Hello World!"; </script>
// random HTML/PHP
<script> document.write(title); </script>

会写出“ Hello World!”吗?这似乎是一种错误的编码约定,否则我怎么能以适当的形式实现类似的目标呢?

如果我在带有JavaScript的HTML页面中有两个单独的脚本,那么整个页面之间是否共享变量?还是仅在自己的声明中?例如:] >>

您的示例中的变量标题被声明为全局变量,因此,它可用于加载到同一页面中的所有脚本。更重要的是,如果同一页面上已经有一个名为title的全局变量,则当您为其分配值“ Hello World!”时,其值将被覆盖。

避免此类问题的通常做法是精确声明一个全局变量,然后将所有其他变量放入其中。例如:

var bobbyS_vars = {
    title: "Hello World!";
};

为单独的全局变量分配一个别人都不会选择的名称,例如您的姓名或雇主的姓名,或最好的,一个属于您或您的雇主的域名。

另一种更常见的处理此问题的方法是利用JavaScript处理函数内变量范围的方法。例如,创建一个匿名函数,在该函数内声明代码的[[all

,然后在声明的末尾通过将()放在声明的末尾来调用该函数。例如:(function() { var title = "Hello World!"; document.write(title); })(); // title is not in scope here, so it is undefined, // unless it were declared elsewhere.
如果您

想要

共享一些变量,但不共享其他变量,请让匿名函数使用多种方法:var bobbyS_vars = { title: "Hello World!"; }; (function() { var employeeId = "E 298"; var count = 7; document.write("<p>" + bobbyS_vars.title + "</p>"); document.write("<p>" + employeeId + "</p>"); })(); // At this point, bobbyS_vars.title is in scope and still has the // value "Hello World!". Variables employeeId and count are not // in scope and effectively private to the code above.
最后一点。您的代码声明的所有函数实际上也是全局变量。因此,如果您创建一个名为printTitle的函数,则它是1)该页面上的所有其他代码都可用,并且2)可能被同一页面上也称为printTitle的另一个函数覆盖或覆盖。您可以像保护其他变量一样保护和/或公开函数:

var bobbyS_vars = { }; (function() { // Private functions var function = addOne(i) { return i + 1; }; // Public vars bobbyS_vars.title: "Hello World!"; // Public functions bobbyS_vars.printTitle = function() { document.write("<p>" + bobbyS_vars.title + "</p>"); document.write("<p>" + addOne(41) + "</p>"); }; })(); // At this point, function addOne is not directly accessible, // but printTitle is. bobbyS_vars.printTitle();

请注意,尽管addOne函数实际上是闭包内的私有函数,但仍可以通过printTitle函数间接访问它,因为addOne和printTitle都在同一范围内。

titleGlobal范围内,对于在Web浏览器中运行JavaScript的情况,它是window对象。当您在任何会限制其作用域的函数之外说var title = "Hello World!"时,它与说window.title = "Hello World!"相同。您的代码等效于此:

<script> window.title = "Hello World!"; </script> <!-- random HTML/PHP --> <script> document.write(title); // or document.write(window.title) works just as well </script>

它们将根据范围规则等一起“共享”。单独的文件对此没有影响,除了包含所述文件的顺序。

编辑:相同的规则也适用于嵌入式脚本。

并详细说明例外情况:

如果我在Foo文件中声明以下内容:

var fooVar = barVar;

然后我在文件栏上声明了以下内容:

var barVar = 'bar';

而且我按此顺序包括它们:

<script type="javascript/text" src="foo.js"></script> <script type="javascript/text" src="bar.js"></script>

您会得到一个解释错误,因为在声明前先使用了barVar。>>         

在这种情况下,标题将是全局变量。您需要将变量封装在范围内。有多种方法可以这样做。我的首选是一个自执行的匿名函数,它将像这样进行:

(function() { var title = "Hello world!"; alert(title); // would pop up "Hello World!" since title is in scope }); alert(title); // title doesn't exist, because it's outside the scope

window保存所有变量。所有脚本都在母window对象中。因此,所有变量都在一个空间中。但是,可以将它们本地化为功能,等等。
javascript coding-style
5个回答
32
投票

您的示例中的变量标题被声明为全局变量,因此,它可用于加载到同一页面中的所有脚本。更重要的是,如果同一页面上已经有一个名为title的全局变量,则当您为其分配值“ Hello World!”时,其值将被覆盖。

避免此类问题的通常做法是精确声明一个全局变量,然后将所有其他变量放入其中。例如:

var bobbyS_vars = {
    title: "Hello World!";
};

10
投票
titleGlobal范围内,对于在Web浏览器中运行JavaScript的情况,它是window对象。当您在任何会限制其作用域的函数之外说var title = "Hello World!"时,它与说window.title = "Hello World!"相同。您的代码等效于此:

<script> window.title = "Hello World!"; </script> <!-- random HTML/PHP --> <script> document.write(title); // or document.write(window.title) works just as well </script>


2
投票
它们将根据范围规则等一起“共享”。单独的文件对此没有影响,除了包含所述文件的顺序。

编辑:相同的规则也适用于嵌入式脚本。


1
投票
在这种情况下,标题将是全局变量。您需要将变量封装在范围内。有多种方法可以这样做。我的首选是一个自执行的匿名函数,它将像这样进行:

(function() { var title = "Hello world!"; alert(title); // would pop up "Hello World!" since title is in scope }); alert(title); // title doesn't exist, because it's outside the scope


1
投票
window保存所有变量。所有脚本都在母window对象中。因此,所有变量都在一个空间中。但是,可以将它们本地化为功能,等等。
© www.soinside.com 2019 - 2024. All rights reserved.