coffeescript编译成js之后在前端用js调用其函数的问题

发布于 2022-09-01 06:43:55 字数 580 浏览 27 评论 0

比如我在coffeescript里写一个函数:

abc=->
    1+1

编译成js后是:

(function() {

    var abc;
    abc = function() {
      return 1 + 1;
    };

}).call(this);

然后我在html里引用编译后的js:

<script src="js/js.js"></script>
<script type="text/javascript">
    alert(abc());
</script>

但是并不能找到abc这个函数
把(function() {...}.call(this)外面包的这层去掉之后才可以。

应该是把abc变成了局部的函数了……
那我应该怎么办?总不能每次编译之后再手动把包裹的.call(this)去掉吧?

ps:它默认的编译方式,这样包裹起来有什么好处?还是说只是适用于nodejs的时候有好处?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

半窗疏影 2022-09-08 06:43:55

补充一下 @Neil_吕 的答案。

coffee 编译器默认的行为避免了变量污染,因为使用 coffee-script 进行开发时,变量的声明和使用对于开发者而言都是「不可见」的,所以极易出现变量污染的情况。所以在开发的过程中,不建议去掉 wrapper, 如果需要声明为全局变量并且知道其风险,可采取以下方式:

coffeeabc=@abc=()->
    …
    …
因为看清所以看轻 2022-09-08 06:43:55

coffee -c file.coffee --bare加上bare 属性. 包上一层的好处是避免变量污染。

天荒地未老 2022-09-08 06:43:55

这种默认的解析方式本质上并不是为了适应nodejs 的模块化方式,相对的,我反而觉得是为了浏览器端。
楼主想要的那种效果:
事实上是我们在写代码的时候不推荐的书写方式,
这样会将自己代码中定义的所有变量暴露到顶级作用域,
相当于定义了一个

window.abc = function(){};

coffeeScript在很大程度上就是通过更严谨的语法避免这种危险的做法(多人协作开发非常容易造成冲突)。
如果你确实想要赋值window对象属性,也可以很明确到告诉它:

@abc=->
    1+1

或者

this.abc=->
    1+1

全局的abc方法自然就可以被访问到了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文