Javascript 为什么存储实例的应用程序是全局的?

Javascript 为什么存储实例的应用程序是全局的?,javascript,requirejs,Javascript,Requirejs,我不是来自JavaScript世界,但在闲暇时间我会玩它。我正在使用require.js。 我经常看到将实例存储到window对象的应用程序可以从其他任何地方访问。根据我的经验,使用全局实例是一种糟糕的设计。我错了吗?对于我的申请,我目前还不需要。也许我欠require.js的债,但我不明白全局对象的使用。有人能解释一下吗?不加区别地用标识符填充(或“污染”)全球空间确实是非常有问题的。原因很简单:库A决定在全局空间中将其入口点声明为main,库B也会执行相同的操作,因此会发生冲突。甚至可能需要

我不是来自JavaScript世界,但在闲暇时间我会玩它。我正在使用require.js。 我经常看到将实例存储到window对象的应用程序可以从其他任何地方访问。根据我的经验,使用全局实例是一种糟糕的设计。我错了吗?对于我的申请,我目前还不需要。也许我欠require.js的债,但我不明白全局对象的使用。有人能解释一下吗?

不加区别地用标识符填充(或“污染”)全球空间确实是非常有问题的。原因很简单:库A决定在全局空间中将其入口点声明为
main
,库B也会执行相同的操作,因此会发生冲突。甚至可能需要多次加载单个库。一个众所周知的例子是加载两个版本的jQuery,因为一个第三方库需要版本X,另一个第三方库需要版本Y。jQuery有
noConflict
调用来帮助管理这个版本


然而,在全球范围内定义一些设施是有用的,只要做得适度。考虑在缺省模式下使用Realjs,导出<代码> Realjs < /C> > <代码>要求< /COD>和<代码>定义< /代码>到全局空间。RequireJS非常小心,不会将其所有内部构件泄漏到全局空间,这非常好。在什么情况下可以接受什么取决于所涉及的开发人员和所涉及的特定应用程序。对于我使用RequireJS开发的应用程序,我发现RequireJS只将三个符号导出到全局空间是可以接受的。如果我改变主意,有一种方法可以防止RequireJS直接导出到全局空间(例如,一种可能是使用
r.js
进行优化,同时使用
名称空间设置,另一种可能是使用
almond
库).

通常,最佳做法是使用尽可能少的全局变量。但许多人并不遵循这些准则。