Node.js:以文件或交互方式运行脚本会产生不同的结果

时间:2014-01-20 17:35:20

标签: node.js

如果我保存下面的行并运行像./node saved.js

var that = this;
that.val1 = 109;
var f1 = function(){return this;}
var f2 = function(){return this;}
var that1 = f1();
var that2 = f2();
console.log(that1.val1)//undefined
that1.val2=111;
console.log(that2.val2)//111

我得到了这个结果

undefined
111

但是,如果我将它粘贴到已经启动的shell ./node,我会得到

...
...
> console.log(that1.val1)//undefined
109
undefined
> that1.val2=111;
111
> console.log(that2.val2)//111
111 

为什么第一个console.log的输出不同?

1 个答案:

答案 0 :(得分:1)

当您在脚本中运行它时,函数内部的this指的是与函数外部不同的对象。例如,我将此更改发送到脚本的开头:

var that = this;
console.log(this)
that.val1 = 109;
var f1 = function(){console.log(this); console.log("eq: " + (this === that));return this;}

当第二行执行时将其作为node test.js运行时,我得到一个空对象,然后f1内的那个被执行更深的几行,这是一个非常不同的对象。

当从Node REPL运行时,我得到的对象与两个地方f1版本中node test.js内的对象匹配。因此,that.va1 = 109在两种情况下对不同的对象起作用,这就是你看到差异的原因。

编辑:请参阅Jonathan Lonowski关于2个不同对象的问题的评论。