0

可能重复: 如何避免 JavaScript 中的全局变量?

我正在寻找一些关于如何最好地在 JavaScript 中管理全局变量的建议。

考虑以下:

foo = 1;
bar = 2;

// Update our global variable
function doStuff (newFooValue) {
    foo = newFooValue
}

// Update a global based on a condition
function doMoreStuff () {
    if (bar == 3) {
        foo = 1;
    }
}

在这两种情况下,我们的函数都在内部访问全局变量,这让我觉得很难看。根据我的阅读,我们希望尽可能避免使用全局变量,以避免阻塞全局名称空间。

那么为我们的全局变量创建一个我们所需要的结构吗?

例如,

var myPage = {}
myPage.foo = 1;
myPage.bar = 2;

我想这解决了全局命名空间冲突问题,但我仍然从我的方法中访问全局范围。

我应该怎么办?

4

2 回答 2

3

为避免全局命名空间污染,您应该将代码包装在立即调用函数表达式 (IIFE)中。JavaScript 变量具有函数作用域,因此它们只存在于声明它们的函数中。

(function () {
    //these variables only exist within the outer function
    var foo,
        bar;
    foo = 1;
    bar = 2;

    //these functions only exist within the outer function
    function fizz() {
        return foo + bar;
    }
    function buzz() {
        return foo - bar;
    }
}());

上面的例子没什么用,因为所有的变量和函数都被封装了,不能在外部使用。任何需要全局的函数/变量都应该手动添加到全局对象中:

(function (g) {
    //not repeating code from above, pretend it's here

    //make the functions globally accessible
    g.fizz = fizz;
    g.buzz = buzz;
}(this));
于 2013-01-12T19:15:26.847 回答
0

也许把它包在一个班级里?

var myPage = {}
myPage.foo = 1;
myPage.bar = 2;
myPage.doStuff = function(newFooValue) {
    this.foo = newFooValue;
}

然后,您只需在全局范围内使用一个位置。您应该避免这种情况,但如果您需要解决全局范围,那么您将这样做。如果您要询问设计模式,则必须更精确。如果您有两个名为 doStuff 和 doMoreStuff 的函数,那么设计起来会非常困难。

于 2013-01-12T19:19:40.413 回答