0

我是新手coffeescript。而我又掉进了 JavaScript 的变量作用域的坑里。

我正在尝试开发简单的控制台脚本node.js,没有类(还),最少的功能编程糖(还)。它是这样的:

fs      = require 'fs'
code    = "test"

fs.readFile 'COD99000430.TXT', (err, contents) ->
    code = contents.toString()

console.log code

它编译为以下 JavaScript:

// Generated by CoffeeScript 1.3.3
(function() {
  var code, fs;

  fs = require('fs');

  code = "test";

  fs.readFile('COD99000430.TXT', function(err, contents) {
    return code = contents.toString();
  });

  console.log(code);

}).call(this);

问题是在运行该代码控制台后只显示 word test,这显然是code变量的初始值。但我希望看到COD99000430.TXT文件的内容。实际上我可以看到它,如果我console.log code在调用中放入匿名回调函数的范围内fs.readFile

我查看了coffieescript 文档,并描述了完全相同的情况。但由于某种原因,它对我不起作用。

我在 Windows 7版本 1.3.3上使用node.js版本 0.8.2 。coffeescript

在我的情况下是否可以有“全局脚本”变量?我如何通过咖啡脚本实现这一目标?

4

2 回答 2

1

你的问题的评论是正确的,我只是想我会提供一些工作代码。

示例 1:只需在fs.readFile回调中记录文件内容。

fs = require 'fs'

fs.readFile 'COD99000430.TXT', (err, contents) ->
  console.log contents.toString()

示例 2:将文件处理代码分解为函数并提供回调以打印内容。

fs = require 'fs'

processFile = (filename, callback) ->
  fs.readFile filename, (err, contents) ->
    callback contents.toString()

processFile 'COD99000430.TXT', (data) -> console.log data
于 2012-08-17T04:10:37.887 回答
0

我稍微修改了你的代码,这样我就可以让它在 jsfiddle 中运行(不得不放弃节点,因为它没有安装在这台机器上)。我认为您需要将 readFile 行更改为函数,然后稍后调用该函数。

code = "test"

read = (err, contents) ->
    code = "XZY".toString()

console.log code
alert(code)

code = read()
alert(code)  

全局变量被认为是“要避免的”。您链接到的咖啡脚本页面确实有一个替代方案:

如果您想创建顶级变量供其他脚本使用,请将它们作为属性附加到窗口或 CommonJS 中的导出对象上。存在运算符(如下所述)为您提供了一种可靠的方法来确定在何处添加它们;如果您同时针对 CommonJS 和浏览器:exports ? 这个

于 2012-08-16T22:58:37.183 回答