Javascript 全局变量未更新
我不熟悉Javascript 全局变量未更新,javascript,node.js,coffeescript,scope,Javascript,Node.js,Coffeescript,Scope,我不熟悉coffeescript。我陷入了JavaScript变量作用域的陷阱 我正在尝试用node.js开发简单的控制台脚本,没有类(还没有),函数式编程最少(还没有)。下面是: fs=需要“fs” code=“测试” fs.readFile“COD99000430.TXT”(错误,内容)-> 代码=contents.toString() console.log代码 它编译为以下JavaScript: //由CoffeeScript 1.3.3生成 (功能(){ var代码,fs; fs=要
coffeescript
。我陷入了JavaScript变量作用域的陷阱
我正在尝试用node.js
开发简单的控制台脚本,没有类(还没有),函数式编程最少(还没有)。下面是:
fs=需要“fs”
code=“测试”
fs.readFile“COD99000430.TXT”(错误,内容)->
代码=contents.toString()
console.log代码
它编译为以下JavaScript:
//由CoffeeScript 1.3.3生成
(功能(){
var代码,fs;
fs=要求('fs');
code=“测试”;
fs.readFile('COD99000430.TXT',函数(err,contents){
返回代码=contents.toString();
});
控制台日志(代码);
}).打电话(这个);
问题是,在运行代码控制台后,只显示单词test
,这显然是code
变量的初始值。但我希望看到COD99000430.TXT
文件的内容。实际上我可以看到它,如果我把console.log code
放在fs.readFile
调用中匿名回调函数的范围内
我已经看过了,并且描述了完全相同的案例。但出于某种原因,它对我不起作用
我在Windows7上使用的是node.js
0.8.2版,coffeescript
1.3.3版
在我的例子中是否可能有“全局脚本”变量?如何通过coffeescript实现这一点?我对您的代码进行了一些修改,以便使其在JSFIDLE中运行(由于此计算机上未安装节点,因此不得不放弃该节点)。我认为您需要将readFile行更改为函数,然后稍后调用该函数
code = "test"
read = (err, contents) ->
code = "XZY".toString()
console.log code
alert(code)
code = read()
alert(code)
全局变量被认为是“要避免的”。但是,您链接到的coffeescript页面确实有一个替代选项:
如果要创建顶级变量供其他脚本使用,
将它们作为属性附着在窗口或中的导出对象上
CommonJS。存在运算符(如下所述)为您提供
找出在何处添加它们的可靠方法;如果你的目标是两者
CommonJS和浏览器:导出?这个
关于您的问题的评论是正确的,我只是想提供一些工作代码 示例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
实际上,这与变量范围或coffeescript无关。它是关于回调和javascript单线程事件循环的。读取文件内容后,将执行提供给
fs.readFile
的回调。调用fs.readFile
后,即在执行回调之前,将立即执行fs.readFile
后面的代码。哦。。。我懂了。。。欢迎来到node.js
。。。谢谢你的提示@shytikov它不是关于node.js的,它是关于javascript和异步操作的。我想说,更多的是关于习惯异步思维。老编剧应该改变他的态度。。。我以前试过的第一个例子,它是有效的。但是第二个,我不知道callback
关键字。它是来自CoffeeScript还是JavaScript?你能给我提供文件的链接吗?我试图找到一些东西,但似乎搜索结果被回调
函数弄乱了。@shytikov:不,回调
不是关键字。它只是一个参数,就像示例中的filename
。你也可以叫它peter
——但习惯上叫它callback
或next
。