为什么要将“null”传递给“apply”或“call”?

2024-03-17

根据这个 JavaScript 参考 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/null:

值 null 是表示 null 或“空”的 JavaScript 文字 值,即不存在对象值。它是 JavaScript 之一 原始值。

function getMax(arr){
  return Math.max.apply(null, arr);  
}

不会显式传递关键字this更清晰,或者至少更具可读性?话又说回来,此时我可能不明白你为什么要使用null.


为什么要将“null”传递给“apply”或“call”?

当您没有希望指定的值时this函数内的指针和您正在调用的函数不需要特定的this值才能正常运行。

显式传递关键字 this 不是更清晰吗?或者至少 更具人类可读性。那么此时我可能不明白为什么 你会使用 null。

在您的具体情况下,最好的选择可能是Math object:

function getMax(arr){
  return Math.max.apply(Math, arr);  
}

虽然事实证明你传递什么作为第一个参数并不重要Math.max.apply(...)(仅因为实施细节Math.max()),通过Math设置this指向与正常调用它时设置的完全相同的东西,例如Math.max(1,2,3)所以这是最安全的选择,因为你最好模拟正常的调用Math.max().

为什么要将“null”传递给“apply”或“call”?

以下是更多详细信息...使用时.call() or .apply(), null当您没有要设置的特定值时可以传递this指针,并且您知道您正在调用的函数不是预期的this具有任何特定值(例如,它不使用this在其实施中)。

注意:使用null with .apply() or .call()通常仅使用作为方法的函数来完成,仅出于命名空间的原因,而不是出于面向对象的原因。换句话说,函数max()是一个关于Math对象只是因为命名空间原因,而不是因为Math对象具有该方法的实例数据.max()需要访问。


如果你这样做:

   function foo() {
       this.multiplier = 1;
   }

   foo.prototype.setMultiplier = function(val) {
       this.multiplier = val;
   }

   foo.prototype.weightNumbers = function() {
       var sum = 0;
       for (var i = 0; i < arguments.length; i++) {
           sum += (arguments[i] * this.multiplier);
       }
       return sum / arguments.length;
   }

   var x = new foo();
   x.setMultiplier(3);
   var numbers = [1, 2, 3]
   console.log(x.weightNumbers.apply(x, numbers));

当你调用的方法.apply()如果需要访问实例数据,那么您必须传递适当的对象作为第一个参数,以便该方法具有正确的this指针按预期完成其工作。

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

为什么要将“null”传递给“apply”或“call”? 的相关文章

随机推荐

  • youtube-api removeEventListener 不工作

    我可以很好地添加事件 addEventListener onStateChange handleStateChange 但当尝试删除该事件时 却没有 removeEventListener onStateChange handleState
  • 获取当前位置div的ID

    我有n个 section 在一个页面中 每个页面都提供了 id 例如 page1 page2 在顶部我放置了 2 个按钮 即 上一个 和 下一个 当按下上一个按钮时 它将滚动到上一个 section 与下一个类似 section 按 下一步
  • JAX-WS - 添加 SOAP 标头

    我正在尝试创建一个独立的客户端来使用一些网络服务 我必须将我的用户名和密码添加到 SOAP 标头中 我尝试添加凭据 如下所示 OTSWebSvcsService service new OTSWebSvcsService OTSWebSvc
  • Facebook 应用程序请求通知未显示在移动网络应用程序的 Facebook iOS 应用程序中

    我有一个配置为 Facebook 画布应用程序的 Facebook 应用程序以及一个包含网站和移动网站 URL 的网站 当应用程序发送应用程序请求 邀请 时 它们仅显示在桌面浏览器中的收件人通知中 而不显示在 Facebook iOS 应用
  • Firebase DatabaseReference 按指定值过滤

    假设我有这个 firebase JSON 结构 我需要获取属性 from 等于 this 的所有问题 我知道我可以使用 Volley 来创建 StringRequest 并从我的 questions json 中获取所有值 然后 在客户端
  • 如何让服务帐户只能访问一个存储桶(Google Cloud)?

    如何提供服务帐号只能访问一个桶 如果你以防万一想再给一个第3方服务访问您的private bucket 问题是默认的 服务帐户 可以访问所有存储桶 但我不知道如何将其限制为仅限一个存储桶 是否可以通过仪表板或仅通过控制台来实现此目的 如果可
  • 向样式组件添加过渡

    我在 React 中有以下组件 const Button styled div width 30px height 30px position absolute right 2em top 50 transform translateY 5
  • 使用秒表分析 .NET 应用程序

    似乎没有免费的 NET 性能分析器可以逐行进行分析 因此 我正在考虑使用秒表进行分析 免费即自由 即许可证包括商业应用程序 编辑 为了回应那些告诉我 购买分析器 的人 我愿意 但如果我能花那么多钱 我会把它花在其他东西上 我试图让我的老板相
  • 如何仅循环 select() 的 fd_set 结果中的活动文件描述符?

    所以在我当前的服务器实现中 目前是这样的 void loop step 1 clear set fd set readfds while true step 1 FD ZERO readfds step 2 loop through soc
  • Node.js UDP (dgram) 处理 DNS 解析错误

    我正在使用 Node 的内置数据报 UDP 套接字进行简单的 UDP 发送 http nodejs org docs v0 3 1 api dgram html http nodejs org docs v0 3 1 api dgram h
  • Django 从注释计数中排除

    我有以下申请 from django db import models class Worker models Model name models CharField max length 60 def str self return se
  • 如何在 C 中处理指针? [复制]

    这个问题在这里已经有答案了 我对 C 很陌生 在学习指针方面遇到了一些问题 我尝试了交换 这就是我能用它们做的所有事情 我知道每个变量在内存单元中都有自己的地址 这是我的讲师告诉我们的 并且每个变量的值都可以通过转到其关联的地址来获取 然后
  • Kendo UI DatePicker - 获取先前的值

    当用户使用日期选择器更改日期时 我尝试进行确认 是否可以从对象模型中获取先前的值 或者我需要推出自己的值 没有 据我所知 但你可以很容易地实现它 如下所示 var datePicker date kendoDatePicker change
  • 为什么 Scala 有时会自动应用 thunk?

    就在 2 点 40 分之后卡特隆之影 http www youtube com user ShadowofCatron s Scala 教程 3 视频 http www youtube com watch v R3gh9jIIbME 指出了
  • InvalidOperationException:撤消操作遇到的上下文与相应设置操作中应用的上下文不同

    我得到以下异常 Exception Type System InvalidOperationException Exception Message The Undo operation encountered a context that
  • JSESSIONID 在什么条件下创建?

    何时 什么条件JSESSIONID被建造 是每个域吗 例如 如果我有一个 Tomcat 应用程序服务器 并且我部署了多个 Web 应用程序 则会有不同的JSESSIONID是根据上下文 Web 应用程序 创建的 还是在 Web 应用程序之间
  • 如何在 StyleCop 设置和并发中的单个“自定义规则”节点下组合多个自定义 StyleCop 规则

    基于几篇好文章 我已经能够成功创建一些自定义 StyleCop 规则 作为参考 这里列出了我发现关于该主题非常有用的几篇文章 如何实施自定义 StyleCop 规则 https sites google com a rees biz mai
  • 为什么 V8 使用指针标记而不是 NaN 装箱?

    我现在正在学习V8内部原理 我了解到V8使用指针标记 https en wikipedia org wiki Tagged pointer用于值存储 但想知道为什么不使用 NaN 装箱 AFAIK NaN 拳击更好 因为它还可以存储双打 而
  • 文本范围选择 MSIE

    我可以在 Firefox 中以编程方式轻松设置 2 个以上元素的选择 但我在 IE 上没有成功 所以我希望这里的任何人都可以帮助我 IE 不支持多个并发选择的 TextRanges 无论是通过编程方式还是手动选择 你可以有一个控制范围 ht
  • 为什么要将“null”传递给“apply”或“call”?

    根据这个 JavaScript 参考 https developer mozilla org en US docs Web JavaScript Reference Global Objects null 值 null 是表示 null 或