我是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。
如果您的应用程序会变大,您可以查看模块依赖库,例如requirejs或browserify
编辑,以确保立即调用匿名函数,以便返回的对象确实是公开的全部。
关于javascript - 在CoffeeScript中,如何在不意外声明的情况下过滤掉全局数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17057217/