“this”关键字在 Nodejs 和浏览器中的行为不同

2023-12-24

我有这段代码:

var obj1;
var obj2;

function x() {
    obj1 = this;
}

function y() {
    obj2 = this;
}

x();
y();

console.log(obj1 === obj2);
console.log(obj1 === this);

我使用命令行在 NodeJS 中运行此代码:node app.js 并在 Chrome 浏览器中作为脚本运行

结果:在 NodeJS 中,结果是: true falseNodeJS 结果 https://i.stack.imgur.com/uCWxi.png

在Chrome浏览器中,结果是: true true浏览器结果 https://i.stack.imgur.com/qvarb.png

怎么会发生这样的事?谁能解释一下幕后到底发生了什么?


在浏览器中,在全局范围内运行,this总是window在你的例子中

var obj1;
var obj2;

function x() {
    obj1 = this; // window
}

function y() {
    obj2 = this; // window
}

x();
y();

console.log(obj1 === obj2);  // window === window = true
console.log(obj1 === this);  // window === window = true

这不是它在 Node 中的工作方式。在 Node.js 中,所有模块(脚本文件)都在自己的中执行closure https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures而浏览器直接在全局范围内执行所有脚本文件。

换句话说,在 Node 中运行的几乎任何文件中,this将只是一个空对象,因为 Node 将代码包装在立即调用的匿名函数中,并且您可以使用以下命令访问该上下文中的全局范围GLOBAL反而。

这一点在文中也有提到全局文档 http://nodejs.org/api/globals.html#globals_global_objects:

其中一些对象实际上并不在全局范围内,而是在模块范围内 - 这将被注意到。

但是,当在 Node.js 中调用没有特定上下文的函数时,通常会默认为全局对象- 相同GLOBAL http://nodejs.org/api/globals.html#globals_global前面提到过,因为它是执行上下文。

所以在函数之外,this是一个空对象,因为代码被 Node 包装在函数中,为每个模块(脚本文件)创建自己的执行上下文,而在函数内部,因为它们是called没有指定的执行上下文,this是节点GLOBAL object

在 Node.js 中你会得到

var obj1;
var obj2;

function x() {
    obj1 = this; // GLOBAL
}

function y() {
    obj2 = this; // GLOBAL
}

x();
y();

console.log(obj1 === obj2);  // GLOBAL === GLOBAL = true
console.log(obj1 === this);  // GLOBAL === {} = false

最后一个在哪里this确实是一个空对象,如上所述


为了完整起见,值得注意的是,在严格模式下,您会在浏览器中得到相同的结果(true, false) 与 Node 中一样,但那是因为变量与 Node 中的变量正好相反

"use strict"

var obj1;
var obj2;

function x() {
    obj1 = this; // undefined
}

function y() {
    obj2 = this; // undefined
}

x();
y();

console.log(obj1 === obj2);  // undefined === undefined = true
console.log(obj1 === this);  // undefined === window = false

这是因为传递的值是this严格模式下的函数不会被强制成为对象(也称为“装箱”)。
对于非严格模式下的普通函数,this始终是一个对象,并且它始终是全局对象,如果calledundefined or nullthis-value,即没有特定的执行上下文。

不仅是自动拳击 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Securing_JavaScript性能成本,但在浏览器中公开全局对象会带来安全隐患,因为全局对象提供对以下功能的访问:"secure"JavaScript 环境必须受到限制。

因此,对于严格模式函数,指定this没有装箱到对象中,如果未指定,thisundefined内部函数,如上所示,但是this仍然是全局范围内的窗口。

同样的事情发生在 Node.js 的严格模式下,其中this函数内部不再是GLOBAL but undefined, and this函数外部仍然是相同的空对象,最终结果仍然是true, false,但值thisNode.js 中的严格模式也会有所不同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“this”关键字在 Nodejs 和浏览器中的行为不同 的相关文章

  • 使用 Ajax Jquery post 请求进行 Json 劫持

    昨天 我读了一些关于如何预防的好文章使用 Asp Net MVC 进行 Json 劫持 http haacked com archive 2009 06 24 json hijacking aspx 规则是 永远不要通过 get 请求发送
  • 在节点环境中存根 jQuery.ajax (jQuery 2.x)

    我正在尝试运行一些需要存根的测试jQuery ajax 我正在使用 SinonJS 来做到这一点 它曾经与旧版本的 jQuery 1 x 一起工作得很好 var require jquery var sinon require sinon
  • JAVASCRIPT - 为什么这个对象没有改变?

    function myFunc theObject theObject make Ford model Focus year 2006 var mycar make Honda model Accord year 1998 var x my
  • Javascript 对象属性名称

    在 C 中 可以将对象属性的名称作为字符串值获取 名称 对象 Property gt myProperty 这可以在 Javascript Typescript 中完成吗 Object Keys 是我找到的唯一东西 但它给了我所有的键 示例
  • Javascript 进程是否有多个执行线程?

    背景 我正在创建一个 地址簿 类型的应用程序 有很多条目需要加载 一个想法是首先加载一小部分条目 让用户开始 然后将剩余条目排队 优先考虑用户单击的条目 例如 如果他们单击以 X 开头的名称 请先加载这些名称 然后再处理队列的其余部分 这个
  • Javascript 将对象推送为克隆

    我将 d3 用于交互式网络应用程序 我需要绑定的数据在交互过程中发生变化 并且由 JSON 变量中的一些选定对象组成 为此 我在 JSON 变量上使用了映射 并进行了一些查询来选择适当的对象 对象被推送到列表中 并且该列表被绑定为新数据 我
  • 如何在React Native的MapView中设置标记

    我想在React Native中的MapView上设置一个标记 但是通过官方文档找不到任何信息MapView https facebook github io react native docs mapview html content 如
  • 如何将一个数组中的所有项目复制到另一个数组中?

    如何将数组的每个元素 其中元素是对象 复制到另一个数组中 以便它们完全独立 我不想更改一个数组中的元素来影响另一个数组 这里的关键是 数组中的条目是对象 并且 您不希望对一个数组中的对象的修改显示在另一个数组中 这意味着我们不仅需要将对象复
  • 检查用户设备的 GPS 是否开启

    我正在使用 jQuery Mobile 和 PHP 开发一个应用程序 我没有使用 Phonegap 或其他框架 我需要找到用户的geolocation 如果用户设备的 GPS 关闭 那么我无法获取位置 现在我需要查找用户设备的 GPS 是否
  • jquery 中的函数返回未定义[重复]

    这个问题在这里已经有答案了 我在 jquery 中调用的函数返回未定义 我检查了该函数 当我对其进行调试时 它返回正确的数据 function addToPlaylist component type add to pl value pl
  • 播放没有音频标签的音频

    是否可以在没有音频标签的情况下仅使用 javascript 播放音频 我通过 tinyMce 编辑器注入脚本 因为我无权访问网站的后端 并且它不支持客户端的音频标签 她只想要当您将鼠标悬停在图像上时发出简单的声音 我已经完成了所有设置 但是
  • 如何知道 .keyup() 是否是字符键(jQuery)

    如何知道 keyup 是否是字符键 jQuery input keyup function if key is a character such as a b A b c 5 3 2 etc not enter key or shift o
  • 从链接打开本地文件夹

    如何通过单击任何链接打开本地文件夹视图 我尝试了很多选择 例如 a href Open folder a or a Open folder a or a Open folder a 解决方案 启动可下载链接 以下内容适用于所有浏览器 但一如
  • 如何从 CSS 选择器中提取类名?

    故事 我目前正在构建一个 ESLint 规则 以警告在 CSS 选择器定位器中使用引导布局导向和角度技术类 目前我在字符串方法中使用简单的子字符串 for var i 0 i lt prohibitedClasses length i if
  • 了解 Document.createElement()

    我在用着GWT及其底层DOM能力 我基本上想要实现的是 Have a div包含一些文本的元素 其中一些文本将被包围span元素 span 元素可相互拖动并提供上下文菜单 New span元素可以由最终用户动态创建 它可能是这样的 在应用程
  • React Redux - 在辅助函数中访问现有存储

    我试图在反应组件之外获取存储实例 存储状态 即在单独的辅助函数中 我有我的减速器 我的动作 我在最上面的组件中创建了一个商店 configStore js import createStore from redux import gener
  • Graphql 将多个查询合并(组合)为一个?

    我正在尝试使用 JavaScript 将多个 GraphQL 查询合并为一个查询 我正在寻找这样的东西 let query3 mergeQueries query1 query2 我们事先不知道哪些查询将被组合 假设我有这样的查询 输入查询
  • 如果 POST 响应仅包含 ID,如何将数据保存到我的 Ember 存储?

    Ember 数据期望我的服务器在每次成功后返回完整的对象POST 但是 我的 API 只返回一种元对象 其中包含id 当 Ember 收到此对象时 记录中的现有数据将被删除 除了id 例如 当我这样做时 var asset App Asse
  • JavaScript 阶乘防止无穷大

    我一直在 JavaScript 中使用这个函数来计算阶乘数 var f function factorial n if n 0 n 1 return 1 if f n gt 0 return f n return f n factorial
  • 如何使用socket.io发送图像文件(二进制数据)?

    我无法从以下位置发送数据Android Client to NodeJS Server I use Socket IO 客户端 https github com socketio socket io client java我的客户端中的ja

随机推荐

  • 如何在 JSF 2 + RichFaces 4 中的输入字段中使用掩码?

    我需要在表单的输入字段中添加一些掩码 我尝试插入jQuery js and jQuery MaskedInput js如下代码所示
  • 为什么当 SBT 程序集发现冲突时 Maven 程序集可以工作

    标题也可以是 Maven 和 SBT 组装插件之间有什么区别 在将项目从 Maven 迁移到 SBT 时 我发现这是一个问题 为了描述这个问题 我创建了一个示例项目 其中的依赖项我发现它的行为有所不同 具体取决于构建工具 https git
  • 从 Bash 脚本在 PostgreSQL 中创建 FUNCTION

    我正在尝试从 Bash 脚本在 Postgres 数据库中创建一个函数 不幸的是 我无法让它工作 这是我的脚本 bin bash Save Postgres command to POSTGRES CMD read d POSTGRES C
  • 在pyspark中将列的内容拆分为行

    我有一个数据框 df SiteID LastRecID Col to split 2 1056962584 214 207 206 205 2 1056967423 213 208 2 1056870114 213 202 199 2 10
  • 为什么Delphi DLL可以使用WideString而不使用ShareMem?

    大卫对另一个问题的回答 https stackoverflow com a 9328272 937125显示返回 WideString 的 Delphi DLL 函数 我从来没有想过如果不使用ShareMem 我的测试DLL functio
  • WordPress:ACF 将行添加到重复器字段

    我正在寻找一种将行添加到 ACF Pro 中的重复器字段的方法 我发现这个帖子 https stackoverflow com questions 24879399 wordpress acf how to add rows to a re
  • 从 MIDI 文件中获取音符数据

    有没有办法从 MIDI 文件中获取音符数据 也就是说 我想将 MIDI 文件分解为其组成部分 以便它们采用唯一单词 或任何其他数据类型 的形式 我最终想要做的是接收 MIDI 文件并在音符中找到模式 进入每个音符 找到它的 被演奏的 频率
  • 为什么React中全局变量执行了两次

    我是前端开发和学习 React 的新手 现在我正在尝试构建一个 hello world 项目 执行后npx create react app myapp 我得到了一个初始的 React 项目 我刚刚在文件中编码App js import R
  • 无法创建套接字工厂“com.google.cloud.sql.mysql.SocketFactory;”

    我似乎无法让这个工作 我在用谷歌灵活的环境并想要连接到我的第二代云SQL数据库 我目前收到此异常 main ERROR com mahlzeit server BootstrappingServerConfig Error trying t
  • Rails:通过 ActiveResource 调用设计身份验证

    我的两个 Rails 应用程序 app1 app2 正在使用活动资源进行通信 app1 调用 app2 在 app2 内创建用户 app2 将创建用户 并希望 app1 然后将用户重定向到 app2 的经过身份验证的页面 从 app1 到
  • 为什么即使 SQL 语句产生语法错误,SQL 注入也会成功?

    In 这个问题 https stackoverflow com q 11873585 869912和一些评论 这个输入 input DELETE FROM table name 建议将 SQL 注入到此 PHP 语句中作为示例 input
  • C++ 中字符串向量的 Reserve() 函数

    我正在尝试填充字符串类型的向量 并且字符串的内存将定期更新 我在论坛中发现 由于每次更新大小时内存重新分配 这两个过程都会消耗大量时间另请阅读 储备功能几乎解决了这两种情况的问题 gt String http www cplusplus c
  • Twig 模板单元测试

    我开始考虑 Symfony 中 Twig 模板的持续集成 模板是独立的逻辑 模板中有错误 但在开发过程中我不想因为目视检查而分心 在 Symfony 中是否有任何现成的解决方案可以对 twig 文件进行单元测试 测试树枝模板中的语法错误 您
  • 如何限制 RAM 以测试内存不足的情况?

    我正在尝试重现当用户用完大量 RAM 时似乎出现的错误 限制计算机可以使用的可用 RAM 或填满大部分 RAM 的最佳方法是什么 我更愿意在不物理删除内存的情况下执行此操作 并且不运行一堆任意的内存密集型程序 即 Photoshop Qua
  • Asp.NET Core 2.1 HostedService - 继续在 Azure 上运行

    我们有一个使用 IHostedService 的 Web 应用程序 有一个这样的例子here https gist github com davidfowl a7dd5064d9dcf35b6eae1a7953d615e3 我们采用的方法是
  • 在 OS X 上初始化 D 运行时

    编辑 这似乎是一个长期存在的问题 没有迫在眉睫的解决方案 http d puremagic com issues show bug cgi id 8133 http d puremagic com issues show bug cgi i
  • Joda-Time:DateTime、DateMidnight 和 LocalDate 的使用

    乔达时间 http www joda org joda time 库包含不同的日期时间类 DateTime http www joda org joda time apidocs org joda time DateTime html 不可
  • 嵌入模式给出错误

    我试图将模式嵌入到我创建的其他模式中 但我不断收到此错误 我不完全确定这里出了什么问题 但我想要做的是将我的事件模式和兴趣模式的引用存储在用户模式内 如果有人能告诉我我做错了什么 那就太好了 谢谢 编辑 我现在收到一个新错误 Users D
  • Django:如何检查用户名是否已经存在?

    我不是 Django 的高级用户 我在网上看到了很多不同的方法 但它们都是针对修改模型的 或者太复杂 我无法理解 我正在重复使用UserCreationForm in my MyRegistrationForm class MyRegist
  • “this”关键字在 Nodejs 和浏览器中的行为不同

    我有这段代码 var obj1 var obj2 function x obj1 this function y obj2 this x y console log obj1 obj2 console log obj1 this 我使用命令