我是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")这是个好办法吗?
发布于 2013-06-12 06:05:36
如果明确告诉Coffeescript,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
};
})();这在文件的所有私有代码周围创建了一个很好的小闭包,并且只公开了窗口‘’moduleName‘、窗口’‘moduleName’和窗口‘’moduleName‘。
如果您的应用程序变大,您可以查看模块依赖库,如所需或褐化。
编辑,以确保匿名函数被立即调用,因此返回的对象确实是公开的全部内容。
发布于 2013-06-12 03:47:55
是的,你的解决方案是一个很好的解决方案。如果没有显式地从其他地方提取引用,Coffeescript将为引用创建一个局部变量,因此需要这样做。如果您知道此代码位于节点或浏览器中,则可以更显式地表示window.attacks或要求包含攻击的文件并以这种方式获取它。如果它打算被共享,那么您的解决方案就是一个好的解决方案。
https://stackoverflow.com/questions/17057217
复制相似问题