Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

NodeJS程序的默认作用域

  浏览器上的JavaScript运行时只要是直接在SCRIPT标签中的代码都是全局作用域运行的。但是在NodeJS中不同,代码是以module的形式被加载的,而module会把代码放入一个匿名函数中,甚至还修改this指向,导致了我们的代码总是不运行在global作用于上。
//这两个代码在浏览器上运行几乎没什么差异
var a='123';
b='456';

//但是NodeJS中就不同
(function(){
  console.log(this.a); //undefined
  console.log(this.b); //456
})();

//默认作用域下的this和global不是一回事
console.log(this==global); //false

//this只是一个空对象而已
console.log(this); //{}

  这就是因为代码不在全局作用域上,虽然我们传给Node的文件包含了这些代码,但这些代码是被放入匿名函数中执行的!
  \node-v0.10.18\src\node.js:878-895
  NativeModule.wrap = function(script) {
    return NativeModule.wrapper[0] + script + NativeModule.wrapper[1];
  };

  NativeModule.wrapper = [
    '(function (exports, require, module, __filename, __dirname) { ',
    '\n});'
  ];

  NativeModule.prototype.compile = function() {
    var source = NativeModule.getSource(this.id);
    source = NativeModule.wrap(source);

    var fn = runInThisContext(source, this.filename, true);
    fn(this.exports, NativeModule.require, this, this.filename);

    this.loaded = true;
  };
  既然如此,那么我们用require引入的文件也可以直接在里面定义全局变量(如果真的有这个必要)。还有为什么模块文件中不能直接对exports赋值也可以从这个代码中看出。exports是一个对象引用参数而已,重新赋值就无法引用原来的对象了。但是我们可以使用module.exports来直接修改module上的exports。
//主程序
console.log(require('test'));
console.log(xxx);
//test模块
global.xxx='直接在模块中操作全局变量主程序也可以获取到';
module.exports='这个模块的返回值是一个字符串而不是对象';
网名:
3.84.186.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^