CoffeeScript中的函数声明

Gra*_*hao 78 javascript jslint function-declaration coffeescript

我注意到在CoffeeScript中,如果我使用以下方法定义函数:

a = (c) -> c=1
Run Code Online (Sandbox Code Playgroud)

我只能得到函数表达式:

var a;
a = function(c) {
    return c = 1;
};
Run Code Online (Sandbox Code Playgroud)

但是,我个人经常使用函数声明,例如:

function a(c) {
    return c = 1;
}
Run Code Online (Sandbox Code Playgroud)

我确实使用了第一种形式,但我想知道CoffeeScript中是否有一种生成函数声明的方法.如果没有这种方式,我想知道为什么CoffeeScript会避免这样做.我不认为JSLint会声明声明的错误,只要函数声明在作用域的顶部.

Tre*_*ham 60

CoffeeScript在一个地方使用函数声明(又名"命名函数"):class定义.例如,

class Foo
Run Code Online (Sandbox Code Playgroud)

编译成

var Foo;
Foo = (function() {
  function Foo() {}
  return Foo;
})();
Run Code Online (Sandbox Code Playgroud)

根据FAQ,CoffeeScript不在其他地方使用函数声明的原因:

归咎于微软这个.最初,每个可以为其检索合理名称的函数都被赋予一个,但是IE 8及更低版本具有范围问题,其中命名函数被视为声明和表达式.有关更多信息,请参阅

简而言之:不小心使用函数声明会导致IE(pre-9)和其他JS环境之间出现不一致,因此CoffeeScript会避开它们.

  • 他正在讨论IE与命名函数表达式的问题(例如`var a = function a(){};`).函数声明(例如`function a(){}`)没有这样的跨浏览器不一致 (31认同)
  • 如果首先在浏览器中使用CS并不疯狂,这对我来说会更有意义.将信念放在DOM处理库中以跟上浏览器变化和弃用是一回事,但当你谈论的事情是实际的源代码本身时,这就像是一个双重危险的依赖.想象一下,在CS社区枯竭10年之后处理遗留代码库,并转向下一个类似于我的轨道类似现象.当一切都开始破坏时,你就可以找到后期弃用的内容并找出CS解析器中要修复的内容. (4认同)

Zai*_*ani 12

是的你可以:

hello()

`function hello() {`
console.log 'hello'
dothings()
`}`
Run Code Online (Sandbox Code Playgroud)

你通过反引号逃脱纯JS

请注意,您不能在函数体上缩进.

干杯

  • 这并没有表明它是在coffeescript中完成的 - 只有coffeescript允许转义为javascript.这也是naaaasty! (19认同)
  • 使用前的定义更令人讨厌xD (9认同)

mat*_*mc3 6

使用CoffeeScript时要记住的一件事是,您可以随时回到JavaScript.虽然CoffeeScript不支持命名函数声明,但您始终可以回退到JavaScript来执行此操作.

http://jsbin.com/iSUFazA/11/edit

# http://jsbin.com/iSUFazA/11/edit
# You cannot call a variable function prior to declaring it!
# alert csAddNumbers(2,3) # bad!

# CoffeeScript function
csAddNumbers = (x,y) -> x+y

# You can call a named function prior to
# delcaring it
alert "Calling jsMultiplyNumbers: " + jsMultiplyNumbers(2,3) # ok!

# JavaScript named function
# Backticks FTW!
`function jsMultiplyNumbers(x,y) { return x * y; }`
Run Code Online (Sandbox Code Playgroud)

您还可以在CoffeeScript中编写一个大胖函数,然后使用反引号技巧让JavaScript调用另一个函数:

# Coffeescript big function
csSomeBigFunction = (x,y) ->
   z = x + y
   z = z * x * y
   # do other stuff
   # keep doing other stuff

# Javascript named function wrapper
`function jsSomeBigFunction(x,y) { return csSomeBigFunction(x,y); }`
Run Code Online (Sandbox Code Playgroud)