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

vars存储在Node.js中的什么位置?

楚乐逸
2023-03-14
问题内容

在任何Web浏览器中,执行以下脚本都会导致将'wee'其发送到控制台。在Node中发送{}

var d = 'wee';
console.log(this.d);

我意识到this在这种情况下,在Node中引用导出对象。我确实知道该global变量,而这不是我要访问的变量。此外,以上脚本也未d在全局对象上设置。到底去哪儿了?我可以console.log(d);在上面的脚本中显式访问它,但似乎完全没有理由将其藏在某些非标准空间中。

我还意识到,删除对象上的varwill声明是预期的行为,尽管在顶级范围内将其值存储在与“
naked”变量不同的位置上看起来很愚蠢。我的意思是,模块系统的要点不是应该采用某种数字预防措施来防止全球污染吗?在这里,打破模式似乎很容易,而且很难做标准的事情。d``global``var

d也没有在module对象上声明。

我不必说明为什么要问这个问题,但我会回答第一个巨魔,并附上“但是为什么要这样做?”

var d = {};
d.bleep = 'y';
var a = Object.keys(d);

d.bloop = 'y';
d.blop = 'y';

var b = Object.keys(d);

// c = b - a;
var c = b.filter(function (item) {
    if(a.indexOf(item) === -1) {
        return true;
    }
    return false;
});

console.log(a,b,c);

以与我可以区分的某些对象状态相同的方式d,我应该能够区分顶级范围的状态。在浏览器中,这是顶级范围中所window引用的对象this。我应该能够在脚本执行之前和之后评估环境的属性,以确定很多事情,其中​​之一就是检查在任意脚本的顶级范围内声明的函数和变量,然后将它们应用于导出对象。这样可以很容易地以编程方式为未编写为脚本的脚本生成模块包装器,并将其简单地forEach应用于顶级函数和要分配whateverThisIs['varFunc']module.exports['varFunc']…的变量列表

和东西…

此行为似乎类似于匿名函数的行为。在一个匿名函数this可以引用该window对象var的情况下,必须直接调用s(因为它们在anonfunc的作用域内),并且在没有var关键字的情况下声明的泄漏vars
可能最终到达该window对象。我尚未阅读完整的手册,也许正好是这样,但是给我的印象是,每个模块都在自己的上下文(窗口)中执行,而Node通过使用globaland在模块上下文之间传递消息module.exports。 ..

我不知道。我想知道。如果您知道,请告诉我。


问题答案:

因此,每个节点模块都包装为函数的主体,如节点源代码中所示

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

因此,如果您使用声明了一个变量var,则该变量对于模块而言是函数局部的,基本上是该模块的私有变量。这是不是一个性质globalmodulemodule.exports,或this。如果您忘记了var,它将global作为属性进入对象。如果在上显式创建一个属性this,则该属性将进入exports其他模块并可供其他模块使用。

这是一个希望能启发您的小程序

var aDeclaredVar = '*aDeclaredVar*';
undeclaredVar = '*undeclaredVar*';
this.aThisProperty = '*aThisProperty*';
module.aModuleProperty = '*aModuleProperty*';
module.exports.anExportProperty = '*anExportProperty*';

console.log('this', this);
console.log('this === exports', this === exports);
console.log('this === module', this === module);
console.log('this === module.exports', this === module.exports);
console.log('aDeclaredVar', aDeclaredVar);
console.log('undeclaredVar', undeclaredVar);
console.log('this.aThisProperty', this.aThisProperty);
console.log('module.aModuleProperty', module.aModuleProperty);
console.log('module.exports.anExportProperty', module.exports.anExportProperty);
console.log('global.undeclaredVar', global.undeclaredVar);
console.log('global.aDeclaredVar', global.aDeclaredVar);

它的输出是:

this { aThisProperty: '*aThisProperty*',
  anExportProperty: '*anExportProperty*' }
this === exports true
this === module false
this === module.exports true
aDeclaredVar *aDeclaredVar*
undeclaredVar *undeclaredVar*
this.aThisProperty *aThisProperty*
module.aModuleProperty *aModuleProperty*
module.exports.anExportProperty *anExportProperty*
global.undeclaredVar *undeclaredVar*
global.aDeclaredVar undefined


 类似资料:
  • 初始化数据段 BSS 堆栈 堆 代码 现在考虑以下程序: 在上面的程序中,arr和x都是在main函数内本地声明的。我认为这意味着它们都将在函数堆栈上分配空间。但是,当我在linux上运行size命令时,我发现实际上正在为数组分配数据段中的空间。

  • 问题内容: 当我在node.js模块中执行此操作时: 去哪儿了?我的意思是:在浏览器中(如果未在函数中执行或以其他方式执行) 如果我执行此操作: 然后可以在中找到它,但这不是我想要的。 问题答案: 与浏览器不同,浏览器默认情况下将变量分配给全局空间(即窗口),而在Node中, 除非您 将变量 明确 分配给module.exports, 否则 变量的作用域为模块(文件)。 实际上,当您运行或文件中的

  • 问题内容: 任何人都可以用C,C ++和Java清楚地解释一下。什么都在堆栈上,什么都在堆上以及何时分配。 我所知道的, 每个函数调用的所有局部变量(无论是基元,指针还是引用变量)都在新的堆栈框架上。 使用new或malloc创建的所有内容都会进入堆。 我对几件事感到困惑。 是在堆上创建的对象成员的引用/基元是否也存储在堆上? 以及在每个框架中递归创建的方法的那些本地成员呢?它们都在堆栈上吗?如果

  • 问题内容: 我设法在目录下找到了容器,但是找不到图像。 什么是目录和文件? 问题答案: 目录的内容根据Docker用于存储的驱动程序而有所不同。 默认情况下,这将是,但可以回落到,,,或者根据您的内核支持。在大多数地方,这是可以的,但是RedHats却接受了。 您可以使用Docker守护程序的或选项手动设置存储驱动程序。 将包含驱动程序特定的图像内容存储。 现在在和文件中仅包含有关图像的元数据。

  • 问题内容: 我很清楚,编译时从Java代码中删除了泛型类型。1.5+ JVM使用什么信息(属性?)来实现等等? 问题答案: 它们存储在属性中;请参阅更新的Java虚拟机规范的 4.8.8节,以及有关字段类型签名格式的4.4.4节。 这是一个使用示例: 此处的属性指定(如果您将其读为big-endian,就像JVM类文件格式中的所有整数一样)恒定池值#30(30 = 0x1E)。因此,让我们看一下:

  • 我已经把我所有的图片从文件夹mipmap移到drawable,因为这里有人说mipmap文件夹只供app图标使用,以便在app mipmap vs.drawable文件夹中使用(答案得到了841个赞)。然而,当我现在想启动我的应用程序时,我得到一个错误消息 在一些实际问题中,人们告诉将图片存储在不同的可绘制文件夹中(参见Android:理解可绘制文件夹),如drawable-xxhdpi或draw