我目前正在将我在Node.js中制作的脚本转换为Electron。但是,我遇到了变量作用域的问题。在Node.js脚本中定义的变量在我的模块中不可用,除非它们被传递或赋值。然而,在电子中,如果我声明了一个变量,它将在我的所有模块中可用,而不需要传递或赋值它。例如,此Node.js脚本将正确地失败:
// index.js
var myModule = require('./src/myModule.js');
var myString = 'string';
myModule.run();
// myModule.js
exports.run = function() {
console.log(myString); // Correctly says myString is undefined because it is not declared in myModule.js
}但是,Electron中的相同代码将打印在renderer.js中定义的变量
// renderer.js
var myModule = require('./src/myModule.js');
var myString = 'string';
myModule.run();
// myModule.js
exports.run = function() {
console.log(myString); // Prints 'string' even though it is not declared in myModule.js
}如何防止在renderer.js中定义的变量在我的模块中可用。我发现它让我很容易创建无组织的代码。
发布于 2020-04-05 13:18:42
您需要将脚本的类型定义为html中的模块。
<script type="module" src="./renderer.js"></script>否则,renderer.js将使用全局作用域来保存您的变量,这就是为什么在您的示例中它可用于myModule.js。
但是您也可以注意到,在myModules.js中定义的变量将像您预期的那样使用局部作用域。这是因为只有通过标记加载的脚本才会使用全局作用域。
因此,执行此操作的另一种选择是创建一个renderer.js,它只包含
// renderer.js
require('./index.js');并且您的原始nodejs文件应该可以正常工作:
// index.js
var myModule = require('./src/myModule.js');
var myString = 'string';
myModule.run();// myModule.js
exports.run = function() {
console.log(myString); // myString is now undefined
}但您应该知道,在renderer.js中定义的变量仍将使用全局作用域。
https://stackoverflow.com/questions/61001951
复制相似问题