从控制台调用CoffeeScript函数

16

最近在尝试使用coffeescript和Rails 3.1.0.rc4。以下是代码:

yourMom = (location) ->
  console.log location

yourMom "wuz hur"

当页面加载时,这段代码能够正确地输出"wuz hur"。但是当我尝试调用它时,会发生什么?

yourMom("wuz hur")

有时候我会从Chrome JS控制台(类似于测试普通JS函数)中获取到一个 "ReferenceError: yourMom is not defined" 的错误信息。

使用CoffeeScript生成的函数可以通过这种方式使用吗?


5
必须抵制开玩笑妈妈的冲动…… - Jesus Ramos
1
叹气。这是 https://dev59.com/UG025IYBdhLWcg3wT0Hq 的重复。请参阅 https://dev59.com/u2025IYBdhLWcg3wST6Q。 - Trevor Burnham
抱歉Trev,我错过了那些内容。当意识到自己的问题是重复的后,最佳做法是什么?我应该将其删除吗? - Lee Quarella
4
“叹气。”:这有点讨人厌。请不要对新手粗鲁无礼。这有点像C++邮件列表时代的RTFM态度。 - jcollum
@LeeQuarella 我会在帖子顶部加上“XYZ的重复(链接)”。现在,重复的帖子会很快被标记为重复,并关闭。 - jcollum
4个回答

39

更简单的共享全局方法/变量的方法是使用@符号,它代表着this。

@yourMom = (location) ->
  console.log location

yourMom "wuz hur"

语法更好,更容易阅读,但我不鼓励您创建全局方法/变量。


1
谢谢你。 :) 虽然这可能是一个旧问题,但我可以问一下为什么您不鼓励创建全局方法/变量吗?如果您不鼓励那样做,人们应该如何从他们的网页中调用函数呢? - Propeller

13

这是因为CoffeeScript会将所有内容都封装在闭包中。该代码的JavaScript输出实际上是:

(function() {
  var yourMom;
  yourMom = function(location) {
    return console.log(location);
  };
  yourMom("wuz hur");
}).call(this);
如果你想将它导出到全局作用域,你可以采取以下两种方式:
window.yourMom = yourMom = (location) ->
  console.log location
或者
this.yourMom = yourMom = (location) ->
  console.log location

1
那么,我不能从控制台调用yourMom函数吗?有没有办法在控制台中使该函数可用?对我来说,控制台调试非常有帮助,有点犹豫使用没有这种能力的coffeescript...(此贴发布于回答被编辑之前) - Lee Quarella
1
你可以看到我提到的两个选项。你只需要确保将它导出到全局范围。 - Jamie Wong
啊,有点烦人。我猜控制台调试不被很多人使用? - Lee Quarella
2
这是正确的做法 - 但在JavaScript中,你应该特别避免发布许多全局变量。将它们抛到全局作用域中,以便在需要调试时使用,然后在完成相关操作后从全局作用域中移除它们。 - Jamie Wong

2

我不确定Rails是否有这个功能,但CoffeeScript编译器有一个选项(--bare)可以在没有函数包装器的情况下进行编译。这对于玩耍很好,但它会污染全局范围。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接