博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈javascript中的call()和apply()方法
阅读量:6440 次
发布时间:2019-06-23

本文共 1478 字,大约阅读时间需要 4 分钟。

  话说在js中,每个函数都包含两个非继承而来的放方法,apply()和call(),使得我们能在特定的作用域中调用函数。

 

官方定义:   

   语法:       fun.call(thisArg[, arg1[, arg2[, ...]]]

参数

thisArg
fun函数运行时指定的
this
需要注意的是,指定的
this值并不一定是该函数执行时真正的
this值,如果这个函数处于 ,则指定为
null
undefined
this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的
this会指向该原始值的自动包装对象。
arg1, arg2, ...
指定的参数列表。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------

其实有一句我觉得特别经典的描述就是:

   通过 call 方法,你可以在一个对象上借用另一个对象上的方法,

  

  咱先来谈谈其共同点:

 

先以call为例:

window.color = "red";    var o = {color: "blue"};    function sayColor(){        alert(this.color);        console.log(this);    }    sayColor();  //red    sayColor.call(this);   //red    sayColor.call(window);   //red    sayColor.call(o);   //blue

在上面的代码中,分别调用了四次sayCokor()函数,第一次,直接调用,与第二个以当前this为对象调用(sayColor(this)),以及直接以window作为对象调用,都是指的当前window对象(可以理解为全局对象),返回window的color属性,而在第四次调用时,将对象o传了过去,此时sayColor方法所调用的color属性就是对象o的color属性了。

   而对于apply():

其实现和call几乎一样,而两者区别在于,当函数需要传入参数时,apply()可以使用参数数组,而call()只能将参数一个一个的传过去。

   例:

      apply(this , [num1 , num2]);

      call(this , num1 , num2);

具体使用环境也是依情况而定的。

说说他们的有点:  不需要对象和方法有任何耦合关系,一般来说,除了window对象以外,我们是很难去直接用对象去掉用和这个对象没有半毛线关系或同处于一个作用域内的方法的。

顺便添加一下最近用到的这两个函数的语句:

  如何获取数组中的最大最小值:

var max2 = Math.max.apply(Math,values);

  吧Math对象作为apply()的第一个参数,从而正确的设置this值。

知识点补充:window对象,WEB浏览器一般讲全局变量作为window对象的一部分属性加以实现。因此,在全局作用域下声明的所有变量和函数,就都称为了window对象的属性

转载于:https://www.cnblogs.com/Frank-C/p/4811239.html

你可能感兴趣的文章
邮件服务器是如何路由邮件
查看>>
NetWrix Active Directory Change Reporter的使用(二)
查看>>
使用Squid构建WEB代理服务器
查看>>
Java网络编程从入门到精通(30):定制accept方法
查看>>
疯狂极客前传:用最快的速度设计一种新的编程语言
查看>>
WCF专题系列(1):深入WCF寻址Part 1
查看>>
笔记本双屏系统的组建
查看>>
RHCE学习<10>LVM分区管理、软RAID和KVM虚拟机
查看>>
三读《UNIX编程艺术》——UNIX哲学
查看>>
OSSIM中分布式消息队列应用
查看>>
如何在2000 professional上使用远程桌面
查看>>
Redis 数据结构与内存管理策略
查看>>
功能测试
查看>>
远程数据库备份解决方案
查看>>
“添加到收藏夹”功能(share)
查看>>
Git中当add错误的时候怎么办?
查看>>
微型项目实践(2):用测试驱动代码生成
查看>>
【读书笔记《Android游戏编程之从零开始》】10.游戏开发基础(View 游戏框架)...
查看>>
linux 编译安装nginx
查看>>
C# 有关文件路径的操作
查看>>