我正在尝试减少 Chrome 扩展中的全局变量,以减少 JavaScript 中的“意大利面”或歧义。
我试图通过一个 init 函数来尝试此操作,该函数在 mousedown eventListener 回调函数中声明这些全局变量,该函数可能会被多次触发。
这样我就可以将这些变量+事件作为此类回调的参数传递给其他 eventListener 回调(即 mouseup 回调)。
我已将问题分解为一个单独的文件:
索引.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script src="test.js"></script>
</body>
</html>
测试.js
isVarsInitOnce = false;
function executesMoreThanOnce() {
const initVariables = function() {
console.log('runs once');
const bools = {
boolOne: false,
boolTwo: false,
boolThree: false
};
const events = {
clickEvent:
function(event) {
//do stuff
},
keyEvent:
function(event) {
//do other stuff
}
};
return {
bools: bools,
events: events
}
};
if (!isVarsInitOnce) {
isVarsInitOnce = true;
let vars = initVariables();
var booleanObject = vars.bools;
var eventObject = vars.events;
}
console.log('objects: ', booleanObject, eventObject);
//attempting to access initialised variable after function is executed more than once will cause an error.
//this is because the booleanObject is now undefined.
booleanObject.boolOne = true;
}
//runs twice
for (let i=0; i<2; i++) {
executesMoreThanOnce();
}
我用来控制执行的方法initVariables()是一个全局布尔变量,isVarsInitOnce它可以有效地初始化变量并设置executesMoreThanOnce()一次在函数中使用的对象。
可以在循环中调用该函数的第一个实例中访问这些for对象,但是undefined当尝试在循环中调用该函数的第二个实例中访问这些对象时,就会访问这些对象for。
这在控制台输出中非常清楚地表示出来:
runs once
test.js:38 objects: {boolOne: false, boolTwo: false, boolThree: false} {clickEvent: ƒ, keyEvent: ƒ}
test.js:38 objects: undefined undefined //<--- (function called 2nd time)
test.js:42 Uncaught TypeError: Cannot set property 'boolOne' of undefined
at executesMoreThanOnce (test.js:42)
at test.js:47
我不确定为什么会发生这种情况。
谁能帮助我理解为什么这不能正常工作?
对于我的情况,有人有更好的建议来减少全局变量吗?
非常感谢。
红糖糍粑
肥皂起泡泡
相关分类