Javascript 如何在函数范围内初始化变量并避免全局范围?
我在全局空间中有一个变量集,如下所示:Javascript 如何在函数范围内初始化变量并避免全局范围?,javascript,Javascript,我在全局空间中有一个变量集,如下所示: let hoverMessageLock = 0; 这允许下面的功能按照我的要求进行操作。其功能是在按钮悬停时添加消息,然后删除所述消息,并在另一个悬停时用新消息替换 我遇到的问题是,我不想将全局空间用于变量,而是将其放在函数本身中。但是,函数本身在每次悬停事件中都会被反复调用,因此如果我在函数范围中设置hoverMessageLock=0,它就会一次又一次地被设置为0。因此,当我的switch语句在全局范围内时,它就不能像预期的那样工作 我知道在其他使
let hoverMessageLock = 0;
这允许下面的功能按照我的要求进行操作。其功能是在按钮悬停时添加消息,然后删除所述消息,并在另一个悬停时用新消息替换
我遇到的问题是,我不想将全局空间用于变量,而是将其放在函数本身中。但是,函数本身在每次悬停事件中都会被反复调用,因此如果我在函数范围中设置hoverMessageLock=0,它就会一次又一次地被设置为0。因此,当我的switch语句在全局范围内时,它就不能像预期的那样工作
我知道在其他使用类的编程语言中,可以在类作用域中设置变量,然后以与函数中全局作用域相同的方式修改它们。在Javascript中是否也有这样做的方法
let macroManager = {
hoverMessage: function(message, style = "hovertext noTextSelect"){
switch (hoverMessageLock){
case 0:
uiManager.messageDirector.addMessage(""+message+"", 0, 0, style);
hoverMessageLock = 1;
break;
case 1:
uiManager.messageDirector.removeMessage();
uiManager.messageDirector.addMessage(""+message+"", 0, 0, style);
break;
}
},
}
您可以为此使用立即执行的函数表达式(IIFE)
let macroManager=(函数(hoverMessageLock){
返回{
hoverMessage:function(message,style=“hovertext noTextSelect”){
开关(悬停消息锁定){
案例0:
uiManager.messageDirector.addMessage(“+message+”,0,0,style);
hoverMessageLock=1;
打破
案例1:
uiManager.messageDirector.removeMessage();
uiManager.messageDirector.addMessage(“+message+”,0,0,style);
打破
}
},
};
})(0);代码>您可以使用IIFE表达式创建本地作用域:
var macroManager=getMacroManager();
函数getMacroManager(){
返回(函数(){
var hoverMessageLock=0;
返回{
hoverMessage:function(message,style=“hovertext noTextSelect”){
开关(悬停消息锁定){
案例0:
uiManager.messageDirector.addMessage(“+message+”,0,0,style);
hoverMessageLock=1;
打破
案例1:
uiManager.messageDirector.removeMessage();
uiManager.messageDirector.addMessage(“+message+”,0,0,style);
打破
}
},
};
})();
}
因此,每次调用getMacroManager()
都会得到一个单独的实例,因此,hoverMessageLock
将作为一个局部变量工作,这就是您所期望的情况
以下是关于生活的更多信息:
.您已经有了一个对象,它可以很好地工作,正如您在基于类的语言中所描述的那样。类只是创建对象的一种方式,而对象就是这里所需要的一切
只需将属性添加到对象:
let macroManager = {
hoverMessageLock: 0,
hoverMessage: function(message, style = "hovertext noTextSelect"){
switch (this.hoverMessageLock){
case 0:
uiManager.messageDirector.addMessage(""+message+"", 0, 0, style);
this.hoverMessageLock = 1;
break;
case 1:
uiManager.messageDirector.removeMessage();
uiManager.messageDirector.addMessage(""+message+"", 0, 0, style);
break;
}
},
}
请注意,根据您如何使用hoverMessageLock
方法,它的此
上下文可能会丢失(例如,如果您将其用作事件处理程序)-这可以通过将其定义为箭头函数来轻松修复:hoverMessage:(message,style=“hovertext noTextSelect”)=>{…}
我还建议,如果0和1是hoverMessageLock
变量/属性的唯一预期值,则使用布尔值false/true代替。为什么不能在全局范围内?如果你想知道类,js确实有这些。我只是不想污染全局空间并试图养成习惯。好的,像类宏管理器{…}这样的东西会工作吗?是的,它会工作得很好这个解决方案最适合。这里的其他解决方案似乎也很有效,但我讨厌它让我的代码看起来不可读。非常感谢你!
let macroManager = {
hoverMessageLock: 0,
hoverMessage: function(message, style = "hovertext noTextSelect"){
switch (this.hoverMessageLock){
case 0:
uiManager.messageDirector.addMessage(""+message+"", 0, 0, style);
this.hoverMessageLock = 1;
break;
case 1:
uiManager.messageDirector.removeMessage();
uiManager.messageDirector.addMessage(""+message+"", 0, 0, style);
break;
}
},
}