Javascript AMD模式混乱-持久化属性值

Javascript AMD模式混乱-持久化属性值,javascript,requirejs,Javascript,Requirejs,因此,我试图通过使用javascript来了解javascript AMD模式。我在JS方面的经验是有限的,毫无疑问这就是阻碍我的原因。如果我被指向“傻瓜JS”的方向,我不会感到惊讶。如果有人能在这方面帮助我,我将非常感激 我定义了一个名为“security”的模块,它的定义如下:稍微精简一点 define(['services/storage'], function(storage) { var security = { authToken: {}, loadAuthToke

因此,我试图通过使用javascript来了解javascript AMD模式。我在JS方面的经验是有限的,毫无疑问这就是阻碍我的原因。如果我被指向“傻瓜JS”的方向,我不会感到惊讶。如果有人能在这方面帮助我,我将非常感激

我定义了一个名为“security”的模块,它的定义如下:稍微精简一点

define(['services/storage'], function(storage) {

var security = {
    authToken: {},
    loadAuthToken: loadAuthToken,
    saveAuthToken: saveAuthToken,
};

return security;

function saveAuthToken(token) {
    if (token) {
        storage.save("DiffusrAuthToken", token);
        security.authToken = token;
    }     
};

function loadAuthToken() {       
    if (security.authToken.expires) {
        return security.authToken;
    } else {
        var token = storage.load("DiffusrAuthToken");
        security.authToken = token;
        return token;
    }
};
})
本质上,我想保存模块中定义的一些值的状态,在上面的例子中是
authToken
。这样,当其他模块需要此模块时,我不必去
localStorage
获取它。我能让它工作的唯一方法是定义返回对象的一个属性,并在开始时将其设置为空对象。这似乎并不令人满意,因为我不想将其直接公开给其他模块,因为它们可能会更改它

非AMD的方法是在全局范围内定义一个对象并将属性附加到它。但是,我认为AMD的全部目的是避免这种情况


问题:通常,我应该如何在模块中设置可从其他模块访问的值?

任何未在模块中导出的内容都无法在模块外部访问,但在模块关闭中仍然可用。例如,您可以创建一个var,但决不能将其作为
security
export对象的属性附加。您可以为导出对象创建特定的访问器方法,该方法只能以您希望模块用户使用的方式访问此私有变量,就像您使用
saveAuthToken
loadAuthToken
方法所做的那样

define(['services/storage'], function(storage) {

var authToken;  // private to security module

function saveAuthToken(token) {
    if (token) {
        storage.save("DiffusrAuthToken", token);
        authToken = token;  // store to private variable
    }     
};

function loadAuthToken() {       
    if (authToken.expires) {
        return authToken;
    } else {
        var token = storage.load("DiffusrAuthToken");
        authToken = token;
        return token;
    }
};

// export contains no reference to authToken
var security = {
    loadAuthToken: loadAuthToken,
    saveAuthToken: saveAuthToken,
};

return security;

});

太棒了-太简单了,太尴尬了!不过,需要明确的是,私有var的生命周期是什么?require.js是否将该模块保留在内存中,以便在任何时候其他模块使用安全模块时,该值仍被分配给私有变量?只要有对该模块的引用,该值就会存在。您可以使用删除引用,但如果任何其他模块将
安全性
作为依赖项,则模块关闭将保持活动状态。