我正在学习Javascript,我希望与我的程序“互动”,看看我是否正确编写了函数。当我说交互时,我的意思是创建对象,调用递归函数,获取/设置属性等。
当我在Chrome中加载脚本时,我可以在控制台中完成所有这些操作(正常工作)。但是,当我使用Node在我的Mac上尝试相同的方法时,我会遇到各种奇怪的行为。
代码示例:
"use strict";
// simple recursive function
let countDownFrom = (num) => {
if (num === 0) return;
console.log(num)
countDownFrom(num - 1)
}
// Closures
var createPet = function(name) {
var sex;
return {
setName: function(newName) {
name = newName;
},
getName: function() {
return name;
},
getSex: function() {
return sex;
},
setSex: function(newSex) {
if(typeof newSex === "string" && (newSex.toLowerCase() === "male" || newSex.toLowerCase() === "female")) {
sex = newSex;
}
}
}
}
示例1。
在保存我的test.js文件的目录中,我尝试node test.js
命令不会向终端打印任何内容,只是移动到新行。
js git:master❯node test.js
js git:master❯
这当然是合乎逻辑的 - 脚本被加载到内存中,它被执行,结果被打印到屏幕上(因为在脚本中没有进行任何函数调用,所以没有任何可见),之后内存被释放(变量被破坏)。很明显,从这里我不能做countdownFrom(10);
或var pet = createPet("Charlie");
。
示例2。 当我进入交互模式(REPL)时,我做了一个:
要求( './试验')
将空对象{{1}}打印到新行上。如果我然后尝试我的{}
,我会收到以下错误:
ReferenceError:未定义countDownFrom 在repl:1:9
在REPLServer.defaultEval(repl.js:269:27)
在界(domain.js:287:14)
在REPLServer.runBound [as eval](domain.js:300:12)
在REPLServer。 (repl.js:439:12)
在emitOne(events.js:95:20)
在REPLServer.emit(events.js:182:7)
在REPLServer.Interface._onLine(readline.js:211:10)
在REPLServer.Interface._line(readline.js:550:8)
在REPLServer.Interface._ttyWrite(readline.js:827:14)
在我看来,Node并没有像浏览器一样加载和“保持”脚本。我希望能够做到这些:
countDownFrom(10);
P.S。我确实尝试将整个test.js加载到像var pet = createPet(/name/);
pet.getName();
pet.setSex("female");
// ... etc
这样的变量中,但也没有运气:
'> t.createPet( “查理”);
TypeError:t.createPet不是函数
正确的方法是什么?谢谢!