避免全球范围?

时间:2015-06-13 22:09:41

标签: javascript scope

我喜欢在每个需要它的页面中包含我的javascript(更常见的js文件放在文档头中):

-- item.html --
<div id="item">
<script type="text/javascript" src="item.js"></script>
 ...
</div>

所以在我的脚本文件中,我现在可以抓住容器并用它来查找内容:

-- item.js --
var container = $('scripts').last().parent();
var f = container.find('form');

但是,如果需要在页面加载后完成工作:

$().ready(function() {
    var f = container.find('form');
});

我遇到问题,因为container范围跨文件。考虑:

-- index.html --
<div id="item">
<script type="text/javascript" src="item.js"></script>
 ...
</div>
<div id="link">
<script type="text/javascript" src="link.js"></script>
 ...
</div>
<div id="part">
<script type="text/javascript" src="part.js"></script>
 ...
</div>

item.js失败,因为它选择了最后container,而不是在声明它时分配的值$('#part').find('form'); 实质上执行:

$('#item').find('form');

而不是我想要的:

container

所以我的问题是:如何将login_count <- as.numeric( as.character( login_count ) )范围扩展到声明的文件?

或者,我怎么能以不同的方式做到这一点?

3 个答案:

答案 0 :(得分:3)

请使用类似AMD的内容来模拟您的代码以解决此问题。这正是AMD旨在解决的问题。

这有几个可能的库。由于您使用的是jQuery,因此RequireJS可能最有意义,但也有其他解决方案,例如

答案 1 :(得分:0)

我没有一个环境来测试这个,但是这个小改动会起作用吗?

var container = $('script[src="item.js"]').parent();

您必须为每个范围指定文件名,但这似乎不是一种负担。

答案 2 :(得分:-2)

浏览器中的JavaScript是功能范围。这意味着声明的变量(使用var关键字)属于最顶层的函数,或者如果没有函数则属于全局范围。

所以要回答你的问题,你可以在每个文件中执行以下操作:

(function() {
    var someVariable = 1;
    //...
})();

这样做,首先评估并创建匿名函数,然后立即执行它而不带参数。

由于您正在执行一个函数,因此您声明的任何变量(只要您使用var)都将作用于该函数,并且不会全局可用。