Javascript Node.js和Node.js REPL之间的差异
我正在阅读“You don know JS”系列丛书,并尝试运行该片段:Javascript Node.js和Node.js REPL之间的差异,javascript,node.js,javascript-engine,node-repl,Javascript,Node.js,Javascript Engine,Node Repl,我正在阅读“You don know JS”系列丛书,并尝试运行该片段: function foo() { console.log( this.a ); } function doFoo(fn) { // `fn` is just another reference to `foo` fn(); // <-- call-site! } var obj = { a: 2, foo: foo }; var a = "oops, global"; // `a` als
function foo() {
console.log( this.a );
}
function doFoo(fn) {
// `fn` is just another reference to `foo`
fn(); // <-- call-site!
}
var obj = {
a: 2,
foo: foo
};
var a = "oops, global"; // `a` also property on global object
doFoo( obj.foo ); // "oops, global"
正如书中所预期的那样。
Firefox开发控制台上的结果相同
如果我删除声明并只保留赋值a=“oops,global”
,那么它将在REPL和Node.js上按预期运行。这对我来说更有意义,因为通过这种方式,我在全局对象上设置了一个属性,而通过“原始”方式,我只是声明了一个变量
有人能向我解释一下这种行为吗?谢谢大家
编辑:我想我已经接近解决方案了,我注意到如果我制作一个只包含以下内容的脚本foo.js:
var x = 42;
console.log(this);
我得到了{}
,因此x
没有附加到全局对象。如果我启动Node.js REPL并键入相同的代码,我会得到一个附加了x
的大对象:
{
...
x: 42
}
所以我认为区别在于REPL和Node.js中的“谁是全局对象?”当您在Node.js中运行文件时,您的
var a
实际上不在全局范围内,而是函数范围--一个模块函数范围(更多信息)。基本上,文件的所有内容都像在函数中一样运行。因此,var a
实际上在该函数范围内
而在REPL中,它确实是在全球范围内 我得出的结论与您的编辑相同,您可能希望将其作为您自己问题的答案发布。如果我坚持,很抱歉,但我会尽力理解:这与使用
Object.prototype馈送Node.js REPL的原因相同吗代码>和数组。原型
使用{}
和[]
进行回复,而使用相同的输入,浏览器引擎(例如Chrome v8)使用{constructor:ƒ、_uudefinegetter:ƒ、_udefinegetter:ƒ和进行回复[constructor:ƒ,concat:ƒ,find:ƒ,findIndex:ƒ,pop:ƒ,…]
?感谢您的时间。原因不同(即范围)这与引擎决定如何显示它们有更多关系。.prototype
是一个有趣的对象,您应该单独阅读。但它基本上共享一些公共属性,如构造函数
,hasOwnProperty
,等等。Chrome显示{constructor…}对象的
原型
,以及数组的
【构造函数…】
。原型
只是它的风格选择。Firefox的显示方式有所不同。Node根本不显示这些内部属性,但如果您按名称指定它们,即对象。原型。构造函数
,您仍然可以访问它们。
{
...
x: 42
}