NodeJS核心面试题

  • NodeJS中的this为什么是一个空对象?

    class NhwModule {
        constructor(id) {
            this.id = id; // 保存当前模块的绝对路径
            this.exports = {};
        }
    }
    
    因为所有的NodeJS文件在执行的时候都会被包裹到一个函数中:
    (function (exports, require, module, __filename, __dirname) {
    // 我们编写的代码
    });
    通过compiledWrapper.call(module.exports, args);
    执行该函数时,this都被修改为了空的module.exports,所以说在函数里面拿到的this是空的module.exports对象
  • NodeJS中为什么可以直接使用exports, require, module, filename, dirname

    因为所有的NodeJS文件在执行的时候都会被包裹到一个函数中, 这些属性都被通过参数的形式传递过来了
    var args = [module.exports, require, module, filename, dirname];
    compiledWrapper.call(this.exports, args);
  • NodeJS中为什么不能直接exports赋值, 而可以给module.exports赋值

    创建了一个新的module对象,module对象是NJModule的实例:let module = new NJModule(absPath);
    新module对象的exports属性指向空对象:this.exports = {};
    
    (function (exports, require, module, __filename, __dirname) {
        exports = "nhw";
    });
    jsScript.call(module.exports, module.exports);
    return module.exports;
    
    call中的第二个参数module.exports会传递给函数的形参exports
    相当于
    let exports = module.exports;exports指向module.exports也就是指向空对象
    exports = "nhw";仅仅改变的是exports的指向,使其指向了nhw
    exports.name="nhw";为module.exports空对象添加了name属性,值为nhw
    return module.exports;此时module.exports仍然指向空对象
  • 通过require导入包时候应该使用var/let还是const?

    • 导入包的目的是使用包而不是修改包,所以导入包时使用const接收

最后修改:2021 年 03 月 20 日 01 : 52 AM
如果觉得我的文章对你有用,请随意赞赏!