繁体   English   中英

导出变量以便它可以从其他模块和全局范围访问的正确方法是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM