Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Nodejs 中全局 this 的指向 #244

Open
islishude opened this issue Nov 18, 2020 · 0 comments
Open

Nodejs 中全局 this 的指向 #244

islishude opened this issue Nov 18, 2020 · 0 comments
Labels

Comments

@islishude
Copy link
Owner

islishude commented Nov 18, 2020

Nodejs 现在支持两种模块机制,一种是 CommonJS,一种是官方规范 ECMAScript 模块。

全局 this 在 CommonJS 不是指向 global(或者说 globalThis),而是指向 module.export。

console.log(this === module.exports); // true

这是因为 CommonJS 本质上是用函数包裹当前文件生成的一个作用域,所以能用作命名隔离。

(function(exports, require, module, __filename, __dirname) {
    // Module code actually lives in here
});

当这个函数运行时,本质上是用了 wrapfunc.apply(module.exports) 这种差不多的形式,所以最终模块内部,全局 this 指向 module.exports

比如常见在 TypeScript 中的 import helper 函数,用于给模块暴露一个 default 接口给 ESModule 使用。

var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });

而在 ESModule 中,全局 this 指向 undefined,同时我们也就可以通过下面这个等式判断当前模块是 ES 模块。

console.log(this === undefined); // true
@islishude islishude added the Web label Nov 18, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant