【发布时间】:2012-08-17 12:10:37
【问题描述】:
我是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 版。
在我的情况下是否可以有“全局脚本”变量?我如何通过咖啡脚本实现这一目标?
【问题讨论】:
-
这实际上与变量范围或咖啡脚本无关。它是关于回调和 javascript 单线程事件循环的。您提供给
fs.readFile的回调将在文件内容被读取后执行。fs.readFile之后的代码将在调用fs.readFile之后立即执行,即在您的回调执行之前。 -
哦...我明白了...欢迎来到
node.js...谢谢您的提示! -
@shytikov 这不是关于 node.js,而是关于 javascript 和异步操作。
-
更多关于习惯异步思维的信息,我想说。老shell脚本作家应该改变他的态度。
标签: javascript node.js coffeescript scope