我正在尝试减少 Chrome 扩展程序中的全局变量,以减少 JavaScript 中的“意大利面”或歧义。
我试图通过使用一个 init 函数来尝试此操作,该函数在可能多次触发的 mousedown eventListener 回调函数中声明这些否则为全局变量。
这样我就可以将这些变量 + 事件作为此类回调的参数传递给其他 eventListener 回调(即 mouseup 回调)。
我已将问题分解为一个单独的文件:
索引.html
<!doctype html>
<html lang="en">
<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
我不确定为什么会发生这种情况。
谁能帮我理解为什么这不能正常工作?
关于我的案例,有没有人对减少全局变量有更好的建议?
非常感谢。