全局变量未更新

时间:2012-08-16 11:01:49

标签: javascript node.js coffeescript scope

我是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);

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

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

我修改了你的代码,所以我可以让它在jsfiddle中运行(由于它没有安装在这台机器上,所以必须抛弃节点)。我认为你需要的是将readFile行更改为一个函数,然后再调用该函数。

code = "test"

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

console.log code
alert(code)

code = read()
alert(code)  

全球变量被认为是“要避免的”。您链接到的coffeescript页面确实有另一种选择:

  

如果您想为其他脚本创建顶级变量,   将它们作为属性附加到窗口或导出对象中   CommonJS的。存在主义运算符(如下所述)给你一个   找出添加位置的可靠方法;如果你是两个目标   CommonJS和浏览器:出口?此