[英]What is the proper way to export a variable so it can accessed from other modules and the global scope?
我想知道导出 javascript 和函数的正确方法,以便它们可以被其他模块访问,也可以在全局范围内访问。 例如,我有这个带有一些实用功能的 .js 文件。
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min) + min); //The maximum is exclusive and the minimum is inclusive
}
function random_choice(arr){
let index = getRandomInt(0,arr.length);
return arr[index];
}
function setCookie(cname, cvalue, exdays) {
var d = new Date();
d.setTime(d.getTime() + (exdays*24*60*60*1000));
var expires = "expires="+ d.toUTCString();
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}
window.getRandomInt = getRandomInt;
window.random_choice = random_choice;
export {getRandomInt,random_choice,setCookie};
我在 stackoverflow 上找到了一个答案,说要使模块中的变量和函数可以从全局范围(窗口)访问,您可以执行window.VARIABLE = VARIABLE;
这行得通,但这真的是你应该做的吗? 如果您希望从其他模块和窗口范围内访问一些变量或函数,那么正确的方法是什么?
这行得通,但这真的是你应该做的吗?
如果您使用模块,分配给window
非常奇怪 - 模块使脚本部分之间的依赖关系显式,当脚本变大时,这使得事情更易于管理。 在您的情况下,请考虑是否有任何方法可以重构代码以避免全局污染 - 相反,拥有需要getRandomInt
从该模块显式导入它的所有内容。
也就是说,分配给窗口并非完全闻所未闻。 库为窗口分配一个大的命名空间对象是很常见的。 例如,我相信 jQuery 会做类似的事情:
const jQuery = /* lots of code */;
export default jQuery;
window.$ = jQuery;
但通常这种事情最多只做一次。
如果你有一堆各种各样的辅助函数,它们在你的脚本的很多地方被调用,并且你不喜欢在任何地方导入它们,你可以创建一个全局 helpers 对象:
window.shivanHelpers = {
getRandomInt,
random_choice,
};
但是IMO你应该首先考虑它是否绝对必要。 通常,它不是。
如果你在浏览器中使用这个js文件, window
就是一个存放全局变量的地方; 即使你使用var x = 1;
不在任何范围内,它会自动将其绑定到 window 作为window.x = 1
。 如果你在后端的 nodejs 中使用这个 js 文件,你可以使用global
或使用process.env
来存储全局变量,或者如果它是一个模块,你也可以使用module.exports
。
如果你想隐藏某物,你可以试试这个表格:
// set global = window / global, related to your runtime env
(function () {
var hidden_var = 1;
var export_var = 2;
global.export_var = export_var;
})();
// then outside the function,
// you can use global.export_var to get the export_var
// but hidden_var is not available outside the function.
// if you do not want to use it any more
delete global.export_var;
所以正确的方法取决于你的决定; 只要数据可以访问并且不会导致内存泄漏(在任何地方设置并在适当的时候清理)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.