Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在函数范围内初始化变量并避免全局范围?_Javascript - Fatal编程技术网

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;
        }
    },
}