如果我有以下代码:

global.foo = function() {
    console.log("global foo");
}

它们的作用是相同的(输出"global foo"):

foo();
global.foo();

但如果我有:

global.foo = function() {
    console.log("global foo");
}

function foo() {
    console.log("function foo");
}

然后,我从这两个函数调用中得到不同的输出.

如果我只有:

function foo() {
    console.log("function foo");
}

然后调用global.foo()会抛出一个错误:

global.foo is not a function

有人能解释一下这里发生了什么吗?

我使用的是 node 16.19.0

相反,如果我在浏览器中执行相同的操作(使用Window对象),则window.foo和foo是相同的.

推荐答案

关键在于,在JavaScript中有:

  • Node.js中的全局object:global,浏览器中的window
  • 全局scope:顶级函数声明和var变量在全局范围内

如果我有global.foo = function() ...

两者执行相同的操作(输出"global foo"):foo(); global.foo();

这说明,正如康拉德在问题 comments 中指出的那样,全球object强的成员是also available in global scope人:

全局对象的属性将自动添加到全局作用域.


但如果我有:global.foo = function() ...; function foo() ...

然后,我从这两个函数调用中得到不同的输出.

这说明了全局scope shadowing中的变量/函数从全局object(掩蔽)它们的同音异义词.


如果我只有:function foo() ...

然后调用global.foo()会抛出一个错误:"global al.foo不是一个函数"

[.]如果我在浏览器中执行相同的操作(使用Window对象),则window.foo和foo是相同的.

与初始情况相反,全局scope中的变量/函数为not added to the global object in Node.js:

在Web浏览器中,当脚本创建使用关键字var定义的全局变量时,它们将被创建为全局对象的成员.(在Node.js中情况并非如此.)

(注:顶层函数声明与var变量相同)

您可以将全局objectscope视为"相同的"in browsers,而in Node,全局object将是全局scope的"原型".

Node.js相关问答推荐

node 模块错误:类型参数OT具有循环约束''

Mongoose更新在^8.0.3版中,许多似乎不能按预期工作

在Node JS中获取控制台选项卡标题

使用 Google Drive API 按文件夹 ID 检索文件夹的内容

Postgressql的BIGSERIAL自增序列,即使由于唯一约束错误没有创建行,也会自动增加

eSignature API 的 NodeJS SDK 是否支持数据流?

(Mongoose) 删除 TTL 字段失败

使用 .pipe(res) 向客户端发送音频不允许您搜索?

如何更新 MongoDB 中对象数组中的键?

响应发送 200 而不是 403

当我们有esnext时,为什么我们需要nodenext typescript 编译器选项?

yarn.lock 和 npm 的 package-lock 有什么区别?

如何使用 mocha.js 模拟用于单元测试的依赖类?

为什么 JavaScript 的 parseInt(0.0000005) 打印5?

什么使用/尊重 .node-version 文件?

Puppeteer:如何提交表单?

如何解决 Socket.io 404(未找到)错误?

Forever + Nodemon 一起运行

安装 node 包时可以使用自定义目录名称而不是node_modules吗?

桌面应用程序仅支持 oauth_callback 值 'oob'/oauth/request_token