我是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实现这一目标?
答案 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和浏览器:出口?此