我是CoffeeScript的新手,我一直是reading this book。有一个名为“选择”的部分,讨论使用典型的函数编程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")


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

最佳答案

如果您明确告知,Coffeescript将使用全局“窗口”。如果我是我,我会开始直接向窗口分配属性。至少您可以将它们全部放入窗口中的一个对象中,例如:
window.globals = window.globals ? {}然后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

编辑,以确保立即调用匿名函数,以便返回的对象确实是公开的全部。

关于javascript - 在CoffeeScript中,如何在不意外声明的情况下过滤掉全局数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17057217/

10-09 18:46