我刚刚this
在NodeJS环境中看到关键字的奇怪行为。我正在用代码列出它们。我已经使用NodeJS v6.x
,用一个JavaScript
文件运行了这些代码。
如下用一行代码进行测试时,无论是否使用该'use strict'
语句,这都指向一个空对象{}
。
console.log(this)
但是,当我在自执行函数中运行语句时,
(function(){
console.log(this);
}());
它正在打印一个非常大的对象。在我看来,环境创建的全局执行上下文对象NodeJS
。
并且在执行带有'use strict'
语句的上述功能时,预期它正在打印undefined
(function(){
'use strict';
console.log(this);
}());
但是,在使用浏览器时(我仅使用进行了测试Chrome
),前三个示例产生了该window
对象,而最后一个给出了undefined
预期的对象。
浏览器的行为是可以理解的。但是,在的情况NodeJS
下,直到我将其包装在函数中时,它才会创建执行上下文吗?
因此,大多数代码NodeJS
运行时都带有一个空的 global object
吗?
在浏览器中,全局范围是window
对象,而在nodeJS中,模块的全局范围是模块本身,因此,当您在nodeJS模块的全局范围中定义变量时,该变量将在该模块本地。
您可以在 NodeJS文档
中阅读有关此内容的更多信息,其中指出:
全球
<Object> The global namespace object.
在浏览器中,顶级范围是全局范围。这意味着在浏览器中,如果您位于全局作用域var中,则将定义一个全局变量。在Node.js中,这是不同的。顶级范围不是全局范围;var
Node.js模块内部的某些内容对于该模块而言是本地的。
在您编写的代码中:
console.log(this)
在一个空的js文件(模块)中,它将打印一个{}
引用您的空模块的空对象。console.log(this);
自调用函数中,this
将指向包含了所有常见的NodeJS属性和诸如方法在全球范围内的NodeJS对象require()
,module
,exports
,console
…console.log(this)
在自我调用函数中具有 严格模式undefined
的情况下,由于在严格模式下自我调用的函数没有默认的本地作用域对象,它将打印。我使用Node Mongo Native并试图设置一个全局连接变量,但我对两种可能的解决方案感到困惑。你们能帮我找出哪一个是好的吗?1.解决方案(这很糟糕,因为每个请求都会尝试创建新连接。) 解决方案(在app init连接并将连接字符串分配给全局变量)。但我认为将连接字符串指定给全局变量不是一个好主意。 var mongodb;var url='[connectionString]';Mongo
问题内容: 什么是 全球声明 ?以及如何使用?我已经阅读了Python的官方定义; 但是,这对我来说没有多大意义。 问题答案: python中的每个“变量”都限于特定范围。python“文件”的范围是模块范围。考虑以下: 具有局部作用域的对象会在函数退出后立即死亡,并且永远无法检索(除非您拥有它们),但是在函数内,您可以访问模块级作用域(或任何包含的作用域)中的变量: 但是,您不能在该引用上使用赋
问题内容: 这是一个奇怪的行为。 尝试这个 : 为什么列表不需要全局声明?它们是自动全局的吗? 我发现它真的很奇怪,我大多数时候都使用列表,甚至根本不使用global作为全局… 问题答案: 它不是自动全局的。 但是,和之间存在区别-前者重新绑定了name ,因此需要使用它来防止创建相同名称的本地插槽。在后一种情况下,您只是在修改现有的全局对象,该对象可以通过常规名称查找找到(更改列表条目就像在列表
问题内容: 什么是全局解释器锁,为什么会出现问题? 从Python删除GIL周围已经产生了很多噪音,我想了解为什么这是如此重要。我自己从未写过编译器或解释器,所以不要节俭,我可能需要他们理解。 问题答案: Python的GIL旨在序列化从不同线程对解释器内部的访问。在多核系统上,这意味着多个线程无法有效利用多个核。(如果GIL不会导致此问题,那么大多数人就不会在意GIL-只是由于多核系统的普及而成
问题内容: 在日志记录框架中,有一个名为的特殊实例,但是我找不到有关其预期用途的任何文档。的文档只是说 返回名称为的全局记录器对象。 ,而仅记录为 是全局记录器的名称。 我相当广泛的搜索并没有找到更多有用的文档。 全局记录器打算用于什么?那是我错过的地方吗? 问题答案: 为方便随意使用Logging包的开发人员提供了“全局” Logger对象。认真使用日志记录包(例如在产品中)的开发人员应创建并使
问题内容: 我正在使用0.3.1-pre Node.js 这样做: 结果是 但是,在键入“全局”后在控制台中按[Tab]时。给出函数列表,包括parseInt。 那么parseInt是否是 全局 名称空间的成员? 问题答案: 显然,该对象不是浏览器中的全局对象。(根据#nodejs @ freenode中的micheil)实际上仅在内部使用。关于全球关闭的信息。 并且和所有的好友都在自己的全局。不