【问题标题】:making Ramda.js functions globally accessible (without R. )使 Ramda.js 函数全局可访问(没有 R. )
【发布时间】:2018-02-16 23:02:10
【问题描述】:

我想使用 Ramda.js 函数而不输入 R.

我尝试将所有函数添加到全局范围,但它不起作用这是我的尝试

const R = require('ramda'); // R is an object containing lots of functions
for(let x in R) {
    global.x = x;
}

另外,我想知道如何使用 Ramda 库本身来做到这一点。

【问题讨论】:

  • 只是出于好奇,任何具体原因。
  • @HarshGupta 当您在使用 Ramda 时总是需要输入 R.someMethod 时,这很麻烦,如果您尝试使用该库,您就会知道我想说什么
  • Ramda 曾经独自拥有这种能力。我们删除了它,因为它不太符合 Ramda 理念。出于同样的原因,你真的不能完全用 Ramda 函数来做到这一点。 Ramda 不修改用户或全局对象。你必须自己做。
  • 请注意,window API 名称和 Ramda 的名称之间有一点重叠:您必须找到一种方法来跳过这些名称或接受它们会被遮蔽。目前,我认为只有findtoString,但谁知道什么时候会改变?

标签: javascript scope global-variables ramda.js


【解决方案1】:

确保您设置的是名为 x 的属性,而不是 x 属性: 另外,一定要把R[x]的值赋值回去,而不是属性名x

global[x] = R[x];

您也可以尝试遍历 getOwnPropertyNames:

for (const prop of Object.getOwnPropertyNames(R)) {
    global[prop] = R[prop]
}

或者,如果适用,只需将您需要的属性分解到您的范围内:

const {someProp, someOtherProp} = R;

【讨论】:

  • @EngineerPassion 这并没有给我太多继续。为什么循环不适合你?你期望会发生什么?实际发生了什么?如果有错误,那是什么错误?
  • 解构工作正常,但 for 循环不会使该方法全局可访问
  • @EngineerPassion 抱歉,我刚刚修复了帖子。
  • 我个人已经切换到小样本的解构技术,并让 Webpack 之类的东西在更复杂的情况下处理它。
【解决方案2】:

根据 cmets,虽然我不同意输入额外的 2 个字符可能被称为大惊小怪,但这是您的感受。

就像@uber5001提到的de-structure技术,这是一种方式,但它意味着你首先需要将require整个ramda函数转换成R然后检索你需要的函数。

你也可以require只需要需要的功能:

const uniq = require('ramda/src/uniq')
const zip = require('ramda/src/zip')
// and so on

HTH

【讨论】:

    【解决方案3】:

    将 Ramda 的所有函数设置为全局变量可能会有风险。 Ramda 有很多函数,其中一些可能会覆盖你现有的全局变量。 with 语句是一种更好的做法(仍然被认为是一种不好的做法,因为您仍然可以为变量命名),它会解构对象的所有属性,同时不会覆盖您的外部范围变量。

    with(R) {
      pipe(
        map(x => x ** 2),
        filter(x => x > 24)
      )([3, 4, 5, 6]); // => [25, 36]
    }
    

    注意 with 语句在严格模式下是禁用的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 2020-11-18
      • 1970-01-01
      相关资源
      最近更新 更多