1

我对 CoffeeScript 很陌生,而且我一直在读这本书。有一个名为Select的部分讨论了使用典型的函数式编程filter函数。它说你可以这样做:

attacks = (attack for attack in attacks when attack is "a")

目的是过滤掉所有不等于“a”的元素。这工作正常,只要attacks在同一个文件中声明。但是,如果我attacks在另一个文件中声明了,就像这样:

attacks = ["a", "b"]
root = exports ? this
root.attacks = attacks

然后第一个代码编译如下:

function() {
    var attack, attacks, _i, _len;
    ...

你会在for循环中得到一个错误说

TypeError:攻击未定义

我猜这正在发生,因为 CoffeeScript 在它不知道的左侧看到了一些东西,=并决定需要声明它。

我怎样才能避免这种情况?


其实我已经想出了一种方法。那就是修改第一个片段来说明:

root.attacks = (attack for attack in attacks when attack is "a")

这是一个好的解决方案吗?

4

2 回答 2

1

是的,您的解决方案是一个很好的解决方案。如果您没有明确地将它们从其他地方拉入,Coffeescript 将为您的引用创建一个局部变量,因此您需要这样做。如果您知道此代码在节点或浏览器中,您可以更明确地说window.attacks或 require() 包含攻击的文件并以这种方式获取它。如果它打算共享,那么您的解决方案是一个很好的解决方案。

于 2013-06-12T03:47:55.277 回答
1

如果您明确告诉 Coffeescript 将使用全局“窗口”。如果我是你,我会犹豫是否开始将属性直接分配给窗口。至少您可以将它们全部放入窗口上的一个对象中,例如: window.globals = window.globals ? {}then window.globals.attacks = (attack for attack in attacks when attack is "a")。对于更强大的解决方案,您可以考虑以下内容:

window['moduleName'] = (->
  someOtherVariableToExpose = 'something'
  # All of your code

  attacks: attacks
  anotherThing: someOtherVariableToExpose)()

在 javascript 中,这看起来像:

window['moduleName'] = (function() {
  var someOtherVariableToExpose;
  var attacks;

  someOtherVariableToExpose = 'something';
  attacks = 'whatever your code defined it as';
  return {
    attacks: attacks,
    anotherThing: someOtherVariableToExpose
  };
})();

这会围绕这个文件的所有私有代码创建一个很好的小闭包,并且只公开 window['moduleName'].attacks 和 window['moduleName'].anotherThing。

如果您的应用程序会变大,您可以查看模块依赖库,例如requirejsbrowserify

编辑以确保立即调用匿名函数,因此返回的对象确实是所有暴露的对象。

于 2013-06-12T06:05:36.450 回答