对 CoffeeScript 不爽的几点,求指教
发布于 9 年前 作者 jysperm 6497 次浏览 最后一次编辑是 8 年前 来自 问答
  1. 创建与外层作用域同名的变量比较麻烦

在 JS 里我可以这样做:

var a = 'global a';
function func() {
	var a = 'local a';
}

但是在 Coffee 里则只能:

a = 'global a';

func = ->
	do (a = null) ->
		a = 'local a'

为了定义局部变量需要多一层缩进,感觉不是很好。

  1. 没有办法使用 function 语句来定义函数

在 JS 里我可以这样:

module.exports = {
	doXX: doXX,
	doOO: doOO
};

function doXX() {}
function doOO() {}

这样在一个文件的开头可以很清晰地看到这个文件都定义了哪些函数,针对使用者的注释也可以都写在最上部,因为用 function 语句定义的函数会被提前到文件最开头,但在 Coffee 里就没办法这样做。

11 回复

coffee变量的作用域不是函数么? 为何要用(a = null)?

@chapgaga 不用的话会覆盖上一层作用域的变量

  1. 首先跟外层作用域起同名变量并不是一个好主意
a = 'global a'

func = ->
  `var a = 'local a'`
  1. 可以做
module.exports =
  doXX: doXX
  doOO: doOO
  
doXX = ->
  // doXX
  
doOO = ->
  // doOO

@ravenwang

cat test.coffee:

module.exports =
  doXX: doXX
  doOO: doOO
  
doXX = ->
  
doOO = ->

coffee:

coffee> test = require './test'
{ doXX: undefined, doOO: undefined }

这样结果是 undefined.

doXX = ->

doOO = -> module.exports = doXX: doXX doOO: doOO

1 在 python 和 ruby 里面都有这个问题,不过说起来,内外层有同样的名称本来也不是个好主意。里面的也可以委屈一点,写个下划线开头之类的嘛 2 放最下咯。因为 coffee 里面的函数定义是匿名函数赋值的形式,不会像 js 的 function 一样被自动提升。

你说的这两点都是 JavaScript 的糟粕,CoffeeScript 只是避免了这个两个糟粕

还是用es6吧,coffee我只在临时写一些脚本比如抓一个网页什么的才用。看到有npm上的包用coffee来写,觉得比较别扭

https://github.com/jashkenas/coffeescript/issues/712 Github上有关于shadow variables的讨论,也许会有些启发吧。

@andyhu es6出来后,prototype还有存在的必要么?

@chapgaga 是说有了class就不用Class.prototype了吗?如果没理解错的话。 prototype除了用作创建“类”属性和方法以外,也有很多其他作用的,所以肯定有用。推荐看下jQuery作者写的advanced javascript教程

回到顶部