nodejs全局变量是否绑定到“模块”函数?

时间:2016-08-11 03:24:41

标签: javascript node.js module this global

据说nodejs在执行js文件时,在调用具有全局范围的函数时会将this绑定到模块上下文,如下所示:

function father(){
    this.id=10
}
father();
console.log(module.id);

它实际上打印的是“。”,而不是我预期的“10”。如果module是要访问的关键字,我试过这个:

(function (exports, require, module, __filename, __dirname) {
  father();
  console.log(module.id);
})()

但是这一次,它在console.log(module.id)的行中抛出了一个异常,说

  

“TypeError:无法读取未定义的属性'id'。

最后,我尝试了这个:

console.log(this===module);
console.log(this===global);
function f1(){console.log(this===module);}
function f2(){console.log(this===global);}

function g1(){
    return function(){console.log(this===module);};
}
function g2(){
    return function(){console.log(this===global);};
}
f1();
f2();
g1()();
g2()();

打印好了:

false
false
false
true
false
true

与建议的第一个答案不一样。所以我想知道如何在js文件中使用“module”关键字,这是由Nodejs执行的?

最后一次尝试:

function h(){this.a='abc';}
h()
console.log(module.exports.a);

我希望打印“abc”,但仍打印“undefined”

感谢。

1 个答案:

答案 0 :(得分:2)

  

它表示nodejs在执行js文件时会绑定"这个"到模块上下文

No,它已绑定到exports。如果你把

console.log(this === module.exports); // or just `exports`

在您的文件中,它会记录true

  

调用具有全局范围的函数时

没有。模块范围中的this值与函数或它们的调用方式无关。在草率模式下,明确调用的函数中的this值将是全局对象,但它与module对象不同。

function father() {
    console.log(this === global);
}
father(); // true