Coffeescript resetCards不是一个功能

Zun*_*non 3 compiler-errors node.js coffeescript express

我一直在运行coffeescript和nodejs上的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)
Run Code Online (Sandbox Code Playgroud)

这是文件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
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 9

CoffeeScript不像JavaScript那样将功能提升到范围的顶部.在JavaScript中,如果你说:

f();
function f() { }
Run Code Online (Sandbox Code Playgroud)

它会起作用,因为它的定义f被提升到顶部,因此代码相当于:

function f() { }
f();
Run Code Online (Sandbox Code Playgroud)

但是,CoffeeScript仅将声明提升到顶部,而不是定义.所以当在CoffeeScript中这样说时:

f()
f = ->
Run Code Online (Sandbox Code Playgroud)

它在JavaScript中看起来像这样:

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

所以fundefined当它被称为,你会得到一个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()
Run Code Online (Sandbox Code Playgroud)

另一种看待它的方法是认识到这个CoffeeScript:

f = ->
Run Code Online (Sandbox Code Playgroud)

与此JavaScript相同:

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

但那并不完全相同:

function f() { }
Run Code Online (Sandbox Code Playgroud)

function f() { }在CoffeeScript中没有相同的东西.