Coffeescript resetCards 不是一个函数。

4

我一直在nodejs上运行coffeescript和expressjs,我正在编写一个小脚本,用于随机生成9张牌(不重复)。我编写了一个名为resetCards的函数,在每次显示后重置牌,但是当我运行脚本时出现以下错误:

TypeError: resetCards is not a function
    at Object.<anonymous> (/home/zunon/projects/xKoot/router.js:10:1)
    at Module._compile (module.js:398:26)
    at Object.Module._extensions..js (module.js:405:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)
    at Module.require (module.js:354:17)
    at require (internal/module.js:12:17)
    at Object.<anonymous> (/home/zunon/projects/xKoot/xkoot.js:6:10)
    at Module._compile (module.js:398:26)
    at Object.Module._extensions..js (module.js:405:10)

这里是文件router.coffee:


express = require 'express'
router = express.Router()

cards = []

resetCards()

router.route '/randomcard'
    .get (req, res) ->
        cardNames = []
        for i in [1..9] by 1
            cardNames[i] = createCardName()
        console.log cardNames
        res.render 'randomcard', {cardNames}
        return

createCardName = ->
    position = Math.floor Math.random() * cards.length
    cards.splice position, 1
    cards[position]

resetCards = ->
    for i in [1..13] by 1
        cards[i - 1] = "club#{i}"
        cards[i + 12] = "dmnd#{i}"
        cards[i + 25] = "hart#{i}"
        cards[i + 38] = "spad#{i}"
        if i < 3
            cards[i + 51] = "joke#{i}"  

module.exports = router
1个回答

10

CoffeeScript 不像 JavaScript 那样将函数提升到作用域顶部。在 JavaScript 中,如果你这样写:

f();
function f() { }

它会起作用,因为f的定义被提升到顶部,所以该代码等同于:

function f() { }
f();

然而,CoffeeScript只将声明提升到顶部,而不是定义。因此,当在CoffeeScript中这样说时:

f()
f = ->

在JavaScript中,它看起来像这样:

var f;
f();
f = function() { };

当调用f时,它是未定义的,因此会出现TypeError

解决方法是将resetCards()的调用放在resetCards的定义下面:

resetCards = ->
    for i in [1..13] by 1
        cards[i - 1] = "club#{i}"
        cards[i + 12] = "dmnd#{i}"
        cards[i + 25] = "hart#{i}"
        cards[i + 38] = "spad#{i}"
        if i < 3
            cards[i + 51] = "joke#{i}"

resetCards()

另一种看待它的方式是意识到这个 CoffeeScript:

f = ->

与此 JavaScript 相同:

var f;
f = function() { };

但那并不完全相同:

function f() { }

CoffeeScript中没有等同于function f() { }的语法。


谢谢,那个起作用了,我习惯在jQuery的$()函数下面放置函数。我对Node、Express和CoffeeScript都很新,所以我猜我需要习惯将函数与变量放在一起。 - Zunon

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