js函数的apply()与call()

每个函数都包含两个非继承而来的方法:apply()与call()。

这两个方法除了接收的参数不同,功能上相差无几,二者用途皆为在某作用域中调用函数,修改函数体内的this指向。


用例子通俗易懂的解释:

window.color = 'red'
let obj = {color: 'blue'}
function ff() {
    console.log(this)
    return this.color
}

我们在全局中定义一个color和一个对象,一个函数。


直接执行 ff()函数:

因为是在全局中调用,所以this指向全局,打印的值为:red。

使用 ff.apply(obj)

此时的this指向obj对象,所以打印的值为:blue。


使用 ff.call(obj):

与apply一样,this指向obj对象,打印的值为:blue。


我们可以看到,二者在不传参的情况下,作用一致,接下来我们看一下传参各自的表现.

修改一下代码,打印接收到arguments
window.color = 'red'
let obj = {color: 'blue'}
function ff() {
    console.log('arguments.length',arguments.length)
    console.log(arguments)
    return this.color
}

使用 ff.apply(obj,['one','two','three'])

我们可以的看到,传入的参数是一个具有三个项的数组,但是打印出来的是三个分开单独参数,且arguments的长度也为3。

传入非数组参数apply会报错,因为只能接收数组或类数组对象。
ff.apply(obj,'one')


使用 ff.call(obj,['one','two','three']):

使用call()和apply的不同点是,传入的是一个数组,打印出来的参数也就是一个数组,rguments的长度为1。

如果我们想让其分别传递,就只能将参数分开传递:ff.call(obj,'one','two','three')


总结二者在功能上并无差异,仅仅只是在处理传递进来的参数上有所区别,何时使用apply何时使用call,完全取决于使用场景,如果我们想要传入数组参数或者arguments,apply更方便,否则就是call方便,但是我们要记得,apply只能接收数组或arguments,call是其他类型都能接收。

原文链接:segmentfault.com

上一篇:openlayers判断两个多边形的空间关系
下一篇:网页加载优化

相关推荐

  • 🙋Hanjst汉吉斯特改进+enSafeExpression安全表达式等

    Hanjst汉吉斯特模版语言及模版引擎,近期持续改进升级。 这次改进主要是增加了对安全输出表达式兼容,由于涉及到对软件开发过程中的效率和软件运行效率的平衡和取舍,所以多写了几句,以描述这个权衡利弊对...

    15 天前
  • 🙋Hanjst汉吉斯特升级:+showImageAsync及性能改进等

    自2019年元旦🙋Hanjst汉吉斯特 模板语言及其编译引擎发布,已经过去一年多了。 这期间随着 🙋Hanjst汉吉斯特 的推广应用,我们也陆续发布了如下一些更新内容: 🛠️Hanjst/汉吉...

    2 个月前
  • 😉我用 Nuxt.js 仿了个掘金

    前言 首先肯定是要夸夸掘金啦,最开始从 CSDN 到 博客园 再到 掘金,个人感觉掘金的技术氛围非常的nice,真是个宝藏社区👏。技术文章大多以前端为主,对前端开发者非常友好,质量也是歪瑞古的。

    25 天前
  • 😀一个原生js弹幕库

    danmujs 😀一个原生js弹幕库,基于 CSS3 Animation 地址、核心代码 本项目基于 rcbullets,项目约70%的代码基于rcbullets,首先要感谢这个项目的作者,如...

    4 个月前
  • 🕵️‍♀️由原型到JS中的“模拟类”

    讲述了有关 JavaScript 中原型相关知识,又引出了 JavaScript 中的“类“究竟是什么?,以及一系列相关问题。 一、前置知识 1、JavaScript 的面向对象(OOP) ​ 面向...

    2 个月前
  • 🔥《吊打面试官》系列 Node.js 必知必会必问!

    (/public/upload/f204a3b224d986128f1b4d9b8d06cd17) 前言 codeing 应当是一生的事业,而不仅仅是 30 岁的青春🍚 本文已收录 Git...

    3 个月前
  • 🔥0202年了,几个基础的手写函数总得会吧

    这几天看到一个大三大佬面试字节跳动的蚊子,突然觉得自己太辣鸡了···校招的题我一半多都不会啊···赶紧潜下心来学习学习提(an)高(wei)自己,边翻掘金边谷歌,简单实现了几个常用函数···(借鉴了太...

    2 个月前
  • 💖CSS + JS 送学妹满屏幕小爱心

    故事开始 午饭时间,暗恋已久的学妹拉着我的衣袖:“学长学长,你能不能让这些爱心变成五颜六色的吗~”。 我在旁边笑开了花~~~ image.png(/public/upload/04aaa24e...

    1 个月前
  • (vuejs学习)2、使用ElementUI(*)

    1.element安装 开发环境是win10,一到node官网下载node的.msi包(https://npm.taobao.org/mirrors/node/v10.16.0/nodev10.16....

    10 个月前
  • (vuejs学习)1、Vue初上手(*)

    参考《官方(https://cli.vuejs.org/zh/guide/installation.html)》官方: Node 版本要求: Vue CLI 需要 Node.js 8.9 或更高...

    10 个月前

官方社区

扫码加入 JavaScript 社区