有多种方法可以使变量在函数调用中保持不变。它们都涉及将变量声明或存储移到函数范围之外,这样它就不会在每次函数运行时重新创建然后死掉。
函数的属性
一种更简单的方法是将其分配为np_handler() 函数的属性。这可以防止任何全局命名空间污染或冲突,但只要使用它的函数存在,它就会一直存在。可以这样做:
var np_handler = function (act) {
if (act.params.length === 0) {
UserModel.find({ nick: act.nick }, function (err, data) {
if (!data) {
np_handler.lfmuser = act.nick;
} else {
np_handler.lfmuser = data.lastfm;
}
});
} else {
UserModel.find({ nick: act.params[0] }, function (err, data) {
if (!data) {
np_handler.lfmuser = act.params[0];
} else {
np_handler.lfmuser = data.lastfm;
}
});
}
};
// initialize
np_handler.lfmuser = '';
全球范围
如果你想把它和函数放在同一个范围内,你可以在同一个范围内声明它,而不是像这样在本地声明它,但如果 np_handler 在全局范围内,你现在多了一项在你通常尽量避免的全局范围内:
var lfmuser = '';
var np_handler = function (act) {
if (act.params.length === 0) {
UserModel.find({ nick: act.nick }, function (err, data) {
if (!data) {
lfmuser = act.nick;
} else {
lfmuser = data.lastfm;
}
});
} else {
UserModel.find({ nick: act.params[0] }, function (err, data) {
if (!data) {
lfmuser = act.params[0];
} else {
lfmuser = data.lastfm;
}
});
}
};
全局命名空间对象
如果您需要它可以全局访问,但您不想污染全局命名空间,或者您想避免名称冲突的可能性,您可以创建一个全局命名空间对象并使全局命名空间变量是该对象的属性。然后,您可以将所有全局变量作为属性放在一个主全局对象上,并且只在全局空间中引入一个新名称,而不是多个。你可以这样做:
// make sure myGlobals is defined and assign a property to it
var myGlobals = myGlobals || {};
myGlobals.lfmuser = '';
var np_handler = function (act) {
if (act.params.length === 0) {
UserModel.find({ nick: act.nick }, function (err, data) {
if (!data) {
myGlobals.lfmuser = act.nick;
} else {
myGlobals.lfmuser = data.lastfm;
}
});
} else {
UserModel.find({ nick: act.params[0] }, function (err, data) {
if (!data) {
myGlobals.lfmuser = act.params[0];
} else {
myGlobals.lfmuser = data.lastfm;
}
});
}
};