当前位置: 首页 > 面试题库 >

node.js模块和功能中“ this”的含义

公西毅
2023-03-14
问题内容

我有一个JavaScript文件,由加载require

// loaded by require()

var a = this; // "this" is an empty object
this.anObject = {name:"An object"};

var aFunction = function() {
    var innerThis = this; // "this" is node global object
};

aFunction();

(function(anyParameter){
    console.log(anyParameter.anObject);
})(
    this // "this" is same having anObject. Not "global"
);

我的问题是:this在var中a = this;是一个空对象,而this函数中的语句是node.js全局对象的影子。我知道this关键字在功能上有所不同,但我不明白为什么先this不等于全局,而this在功能上等于全局。

node.js如何注入globalthis函数范围内,为什么不将其注入模块范围内?


问题答案:

您必须了解以下一些基本事实才能弄清情况:

  • 在Node模块的顶级代码中,this等效于module.exports。那是您看到的空对象。

  • 当您使用this一个函数内,价值this就是重新确定之前, 每个执行 的功能,并且它的值由下式确定_如何_执行该功能。这意味着this如果调用机制不同(例如aFunction()vs. aFunction.call(newThis)vs. emitter.addEventListener("someEvent", aFunction);等),则完全相同的函数对象的两次调用可能具有不同的值。在您的情况下,aFunction()在非严格模式下运行this设置为全局对象的函数。

  • 当将JavaScript文件require作为Node模块时,Node引擎在包装函数内部运行模块代码。该模块包装函数的this设置为module.exports。(回想一下,函数可以使用任意this值运行。)

因此,您将获得不同的this值,因为每个值都this驻留在不同的函数内:第一个位于Node创建的module-wrapper函数内部,而第二个位于中aFunction



 类似资料:
  • 问题内容: 我有一个JavaScript文件,由加载。 我的问题是:在var中是一个空对象,而函数中的语句是node.js全局对象的影子。我知道关键字在功能上有所不同,但我不明白为什么先不等于全局,而在功能上等于全局。 node.js如何注入到函数范围内,为什么不将其注入模块范围内? 问题答案: 您必须了解以下一些基本事实才能弄清情况: 在Node模块的顶级代码中,等效于。那是您看到的空对象。 当

  • 问题内容: 我对像numpy这样的库如何工作有疑问。导入时,我可以访问许多内置的类,函数和常量,例如,等等。 但是在numpy中,还有其他子模块,例如numpy.testing。 怎么做?以我有限的经验,带有子模块的模块只是带有文件的文件夹,而带有功能/类的模块是实际的python文件。如何创建一个同时具有功能/类的模块“文件夹”? 问题答案: 包含文件和的文件夹称为。包含类和函数的文件之一是。文

  • 在“WebKit,WebKit2,Chromium和Chrome介绍”中,大致了解了WebKit是一个渲染引擎,Chromium是一个浏览器,它们那么分别包含哪些不同的功能模块?它们是如何划分地?本章节来为大家详细解读一下。 WebKit: HTML解析:负责HTML语言的解析 CSS解析:负责CSS的解析工作 图片解码:支持不同编码格式的图片 JavaScript引擎:JavaScript语言的

  • 模块功能 nomodule 禁用内核模块加载功能(CONFIG_MODULES)。 [KNL] module.sig_enforce 强制内核在加载模块时检查模块签名(CONFIG_MODULE_SIG),并且只接受具有合法签名的模块。如果内核开启了CONFIG_MODULE_SIG_FORCE,那么无论是否使用此选项,都将强制检查模块的签名。

  • 一、简介 本主要介绍PHPCMS内置相关模块的标签调用方式 二、目录 内容模块 评论模块 投票模块 公告模块 专题模块 会员模块 友情链接模块 企业黄页

  • 在我们前面的例子中,我们开始看到了。 我们的根模块有一个组件,一个管道和一个服务,其唯一的目的是处理信用卡。 如果我们将这三个元素提取到自己的功能模块,然后将它们导入我们的根模块怎么办? 我们将这样做。第一步是创建两个文件夹以区分属于根模块的元素和属于要素模块的元素。 注意每个模块文件夹下的模块文件: app.module.ts 和 credit-card.module.ts.。让我们先关注后者。