.apply(Math, arrayName) 在 JS 中如何工作?

2023-12-07

more than one关于如何在 javascript 中查找值数组的最小值或最大值的 stackoverflow 问题。这不是那个问题。

我想知道为什么路过.apply()奇怪的事情this论证仍然有效。尽管一篇好博文从 Aaron Crane 那里了解到 Math 对象的 API 是如何变成现在这个样子的,但仍有一些问题没有得到解答。

以下每个代码片段都有效。我的问题是,如何?分配到底发生了什么this这使得每一个都起作用?

标准构造

var values = [45, 46, 47]
var min = Math.min.apply(Math, values);
alert(min); //45

一个奇怪的结构,但范围可能很棘手......

var values = [45, 46, 47]
var min = Math.min.apply(this, values);
alert(min); //45

有点奇怪

var values = [45, 46, 47]
var min = Math.min.apply(global, values);
alert(min); //45

仍然很奇怪,但也许还可以 b/c 浏览器

var values = [45, 46, 47]
var min = Math.min.apply(window, values);
alert(min); //45

很奇怪

var values = [45, 46, 47]
var min = Math.min.apply(null, values);
alert(min); //45

真的很奇怪

var values = [45, 46, 47]
var min = Math.min.apply(undefined, values);
alert(min); //45

使用时.apply(),第一个参数控制什么this函数执行时指针值将被设置。在许多情况下,this价值至关重要。在少数情况下,thisvalue 根本不在函数实现内部使用(通常称为不对实例数据进行操作的静态函数)。什么时候this没用过,没关系this设置为,因此第一个参数是什么并不重要.apply()被设定为。

所以,根据你的具体情况,Math.min() and Math.max()(并且可能所有Math.xxx()功能)不要使用this根本没有指针,因为它们基本上都是静态函数,不对实例数据进行操作。因此,它的设置是什么并不重要,因此您可以将任何您想要的内容作为第一个参数传递给Math.min.apply()并且它不会改变函数调用的结果。


我认为人们仍然应该在那里传递正确的值,这将是Math因为那就是this当你做正常的事情时:

Math.min(x, y);

因此,呈现完全相同的情况Math.min()使用时如上面代码.apply(),你会这样做:

var arr = [x, y];
Math.min.apply(Math, arr);

IMO,这促进了正确的习惯和对第一个论点应该是什么的正确思考,因为它在其他情况下很重要。

仅供参考,类似的问题经常出现$.when.apply($, arr)在 jQuery 中也不使用this其实现中的参数,因此可以将其称为$.when.apply(null, arr)甚至$.when.apply("foo", arr)。就我个人而言,我更喜欢通过第一个“技术上正确”的论点。


仅供参考,在现代 Javascript (ES2015+) 中,您可以使用扩展语法代替.apply()对于这种特定类型的操作:

const arr = [1,2];
const maxVal = Math.max(...arr);

并且,该数组会通过扩展语法自动为您解压缩为单独的参数。并且还没有决定将什么传递给第一个参数.apply()因为你只是做同样的事情Math.max()不进行任何操作的函数调用。

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

.apply(Math, arrayName) 在 JS 中如何工作? 的相关文章

随机推荐

  • 恢复的数据库缺少视图、存储过程和外键

    我正在尝试使用备份还原在 SQL Management Studio SQL Server Express 中创建数据库的副本 本地到本地 当我这样做时 它会复制表和数据 但忽略视图 存储过程和外键 对象资源管理器 gt 写入并单击 数据库
  • 在 R data.table 中创建虚拟变量

    我正在 R 中处理一个非常大的数据集 并且一直在使用数据帧进行操作 并决定切换到 data tables 以帮助加快操作速度 我无法理解 J 操作 特别是我正在尝试生成虚拟变量 但我无法弄清楚如何在 data tables 中编写条件操作
  • 在运行时将 ADO.Net DataSet 指向不同的数据库?

    我有一个大型 ADO Net 数据集和两个具有不同约束的数据库模式 Oracle 数据集将使用任一模式 但我希望能够告诉数据集在运行时使用哪个模式 通过连接字符串 这可能吗 在 Net 2 0 世界中 您可以在运行时更改表适配器上的连接字符
  • void ** 和 void * 的编译警告

    我有一个关于void and void 我知道这是一个老问题 并且之前在 stackoverflow 中已经被问过 某种程度上 所以问题如下 当我在 ubuntu 10 10 下使用 gcc 4 4 3 编译此代码时 收到以下警告 zz c
  • Android:使用捆绑包在片段之间传递数据

    我正在尝试使用捆绑包在不同活动的片段之间传递数据 我有两个片段 片段 A 附加在活动 A 上 片段 B 附加到另一个活动 活动 B 我需要将编辑文本字符串从片段 A 传递到片段 B 我如何使用捆绑包来实现这一点 有人可以给我一个 kotli
  • CSS背景拉伸到窗口底部?

    我正在帮助重新设计一个网站www liveatsheastadium com test 我试图找出一种方法来获得透明背景 使用background rgba 属性 来拉伸页面的整个高度 无论分辨率如何 我尝试将容器 html 和正文高度设置
  • 在 PowerShell 中设置表格格式以导出为 CSV

    我严重睡眠不足 压力很大 所以这可能非常简单 但我仍然无法弄清楚 我想要导出各种内容 例如服务 进程 防火墙规则 本地用户 以及我需要的任何内容作为 CSV 但是每当我将其导出时 当我打开它时 CSV 在 Excel 中只有 1 列 我只希
  • 为什么使用十六进制?

    嘿 我正在看这段代码http www gnu org software m68hc11 examples primes 8c source html 我注意到在某些情况下他们使用十六进制数字 例如第 134 行 for j 1 val j
  • 使用 bq 将 null 加载到 bigquery 中

    当我使用https developers google com bigquery docs reference v2 tables insert try it上传一个 JSON 文件 但未在所有列中插入所有字段 它被接受 并且我的数据中出现
  • 如何在 Android 中使用 XML 创建多语言应用程序?

    我想创建一个多语言 Android 应用程序 包含三种语言 英语 阿拉伯语和波斯语 我必须在资产文件夹中创建三个 XML 文件并解析它们 然后使用一个用于该语言 请帮我解决我的问题吗 您需要有不同的 strings xml 来支持不同的语言
  • Vue SFC 样式未在 webpack 生产构建中提取

    尝试将 vue 和 SFC 添加到我的 webpack 应用程序中 这
  • stringr包中的Perl正则表达式

    The perl 最新版本的 stringr 中不推荐使用该函数 而是使用regex 但是 我似乎无法复制早期的行为 要将字符串向量的第一个字母大写 可以使用以下方法 name lt c jim john bill str replace
  • 如何在 iPhone 上将一张图像与另一张图像进行比较,看看它们是否有一定比例的相似度?

    我基本上想用 iPhone 或 iPad 2 上的相机拍摄两张图像 然后将它们相互比较 看看它们是否几乎相同 显然 由于光线等原因 图像永远不会完全相同 因此我想检查大约 90 的兼容性 我在这里看到的所有其他类似的问题要么不是针对 iOS
  • 通过调用方法将字符串传递给属性参数

    我正在尝试使用 NUnit 并将字符串参数传递给 TestCase 属性 但我得到 属性参数必须是属性参数类型的常量表达式 typeof 表达式或数组创建表达式 这是一个简化版本 但 MyStatic 是一个返回构建的 RegEx 字符串的
  • 在 Hyperledger 结构中动态添加组织或组织中的对等方

    我在用http hyperledger fabric doc readthedocs io en latest getting started html用于 Ubuntu VM 中的 Hyperledger Fabric 设置 根据教程 f
  • 在 Postgres 中将表从一个数据库复制到另一个数据库

    我正在尝试将整个表从一个数据库复制到 Postgres 中的另一个数据库 有什么建议么 提取表并将其直接通过管道传输到目标数据库 pg dump t table to copy source db psql target db Note 如
  • 在 CRM 2011 中禁用系统功能区

    我想使用 javascript 有条件地禁用 CRM 2011 表单中的系统功能区 AddNew 这意味着如果 statusCode 是 X 或 Y 禁用功能区 我该怎么做 我尝试获取功能区的 ID 以便将功能区的类名更改为禁用 但我得到
  • 使用局部变量提升精神

    我想根据先前解析的值定义一个规则 即 e 输入字符串具有以下结构 D
  • 使用 google picker 打开特定的 MimeType

    我正在使用实时 API 并且正在使用 realtime client utils 使用现有代码 我使用此方法创建实时文件 createRealtimeFile function title callback gapi client load
  • .apply(Math, arrayName) 在 JS 中如何工作?

    有more than one关于如何在 javascript 中查找值数组的最小值或最大值的 stackoverflow 问题 这不是那个问题 我想知道为什么路过 apply 奇怪的事情this论证仍然有效 尽管一篇好博文从 Aaron C