CoffeeScript - 手动声明变量

3

问题:在CoffeeScript中是否可以手动声明变量?

我正在开始进行CoffeeScript的单元测试,并在教程中遇到了使用before()after()函数的情况。虽然你可以在JavaScript中声明变量,但在CoffeeScript中似乎无法这样做。 一种(但不是最佳实践)解决方案是将它们添加到window对象中(像这样)。我正在使用的代码来自于http://sinonjs.org/

这是我正在测试的代码:

describe 'Fake server', ->
  before(() -> server = sinon.fakeServer.create())
  after(() -> server.restore())

  it "calls callback with deserialized data", () ->
    callback = sinon.spy()
    getTodos(42, callback)

  # This is part of the FakeXMLHttpRequest API
  server.requests[0].respond(
    200,
    { "Content-Type": "application/json" },
    JSON.stringify([{ id: 1, text: "Provide examples", done: true }])
  )

  assert(callback.calledOnce)

编译成JavaScript后,before和after函数看起来像这样:

before(function() {
  var server;
  return server = sinon.fakeServer.create();
});
after(function() {
  return server.restore();
});

正如您所看到的,变量server在before函数内部声明,因此无法在错误的作用域之外使用。


server.requests[0] 这行代码应该会失败,因为此时 server 还没有被初始化,不是吗? - deceze
没错,我似乎无法让它工作,但这是以后的问题,你提到的解决方案在其他代码中使用相同的before和after结构可以正常工作。正是因为这个失败,我需要在before()函数之前初始化server - Mathieu Brouwers
1个回答

5
server = undefined  # or null, or false
before -> server = ...
after -> server.restore

在JavaScript中,你可以使用var foo;来创建变量,但在CoffeeScript中,你需要分配一些值来创建变量。但是,由于var foo;意味着foo的值为undefined,因此只需分配undefined即可达到相同的效果。


谢谢,这就是我想要的。之前我尝试过 server = null,但没有起作用。现在确认了,我知道一定是我的代码有问题。 - Mathieu Brouwers

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