Javascript中call与apply的学习笔记


Posted in Javascript onSeptember 22, 2014

先看MDN中对于call的解释

call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法.

注:该方法的作用和 apply() 方法类似,只有一个区别,就是call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组。

语法

fun.call(thisArg[, arg1[, arg2[, ...]]])

参数
thisArg

在fun函数运行时指定的this值。需要注意的是,指定的this值并不一定是该函数执行时真正的this值,如果这个函数处于非严格模式下,则指定为null和undefined的this值会自动指向全局对象(浏览器中就是window对象),同时值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象。

arg1, arg2, ...

指定的参数列表。

MDN上的例子一开始并不是很好理解,这里我贴出来,有兴趣可以自己去看看 call-Javascript

这里的thisArg解释为在fun运行时指定的this值,也就是说使用了call后,fun中的this指向了thisArg?看代码

var p="456"; 
 function f1(){ 
  this.p="123"; 
 } 
 function f2() { 
  console.log(this.p); 
 } 
 f2();       //456  f2.call(f1());  //123  f2.apply(f1());  //123

第一次输出是调用的全局变量,之后由于call和apply的使用,f2中的this指向了f1,因此,输出变成了123,其实也就是f1借用了f2的方法输出了自己的p

这时将f1()中的this.p删除,会输出三个456,也就证实了当this为null或者undefined时其实指向了全局变量

至于指向原始值是指向它的包装对象这里,由于我理解的包装对象都是临时的,而且测试时只输出了原始值的类型而不是object,这里如何证明如果有知道的朋友希望可以和我讨论下,谢谢!

既然call可以实现一个对象借用另一个对象,不就可以实现继承了么?看代码

function f1(){ 
  this.father="father"
 } 
 function f2() { 
  f1.call(this); 
  this.child="child"; 
 } var test=new f2(); 
console.log(test.father);  //father

test中是没有father的,由于f2()中的

 f1.call(this);

这里的this指向的就是f2,也就是f2借用了f1的方法,其实也就实现了继承

下面讲一下这里的参数,这里的参数是传递给fun的,看代码吧

function f1(){ 
  this.p="123"; 
 } 
 function f2(x) { 
  console.log(this.p); 
  console.log(x); 
 } 
 f2.call(f1(),456);   //123 
//456

先输出123是因为f1中的p,之后的456是传递给f2的参数,很容易理解

主要是注意call和apply中参数的区别

call是一个一个传入的,而apply是传入的一个数组

function f1(){ 
  this.p="测试call"; 
 } 
 function f2(x,y,z) { 
  console.log(this.p); 
  console.log(x); 
  console.log(y); 
  console.log(z); 
 } 
   function f3(){ 
  this.p="测试apply"; 
 } 
 f2.call(f1(),4,5,6);  
 f2.call(f1(),[4,5,6]);  
 f2.apply(f3(),[4,5,6]); 
 f2.apply(f3(),4,5,6);

这里可以看到结果

Javascript中call与apply的学习笔记

第一段测试call是正确输出

第二段测试call由于传入数组,所以先输出一个数组然后两个undefined

第三段测试apply正确输出

第四段由于参数格式错误直接报错

这里的区别应该很明显了

Javascript 相关文章推荐
myFocus slide3D v1.1.0 使用方法与下载
Jan 12 Javascript
JS清除IE浏览器缓存的方法
Jul 26 Javascript
js防止表单重复提交的两种方法
Sep 30 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
Nov 05 Javascript
javascript中的五种基本数据类型
Aug 26 Javascript
javascript事件绑定学习要点
Mar 09 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
May 26 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
Jul 04 Javascript
基于JS设计12306登录页面
Dec 28 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
Apr 20 Javascript
微信小程序 可搜索的地址选择实现详解
Aug 28 Javascript
Vue学习笔记之计算属性与侦听器用法
Dec 07 Javascript
Javascript中this的用法详解
Sep 22 #Javascript
JavaScript的作用域和块级作用域概念理解
Sep 21 #Javascript
JavaScript中双叹号!!作用示例介绍
Sep 21 #Javascript
原生JavaScript实现合并多个数组示例
Sep 21 #Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
Sep 21 #Javascript
将数字转换成大写的人民币表达式的js函数
Sep 21 #Javascript
判断window.onload是否多次使用的方法
Sep 21 #Javascript
You might like
社区(php&&mysql)四
2006/10/09 PHP
MySQL数据源表结构图示
2008/06/05 PHP
使用PHP导出Redis数据到另一个Redis中的代码
2014/03/12 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
firefox火狐浏览器与与ie兼容的2个问题总结
2010/07/20 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
浅析jQuery对select操作小结(遍历option,操作option)
2013/07/04 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
禁用页面部分JavaScript不是全部而是部分
2014/09/03 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
webpack 1.x升级过程中的踩坑总结大全
2017/08/09 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
js最简单的双向绑定实例讲解
2018/01/02 Javascript
React Native 真机断点调试+跨域资源加载出错问题的解决方法
2018/01/18 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
JavaScript数组基于交换的排序示例【冒泡排序】
2018/07/21 Javascript
用POSTMAN发送JSON格式的POST请求示例
2018/09/04 Javascript
在vue中多次调用同一个定义全局变量的实例
2018/09/25 Javascript
node 标准输入流和输出流代码实例
2019/09/19 Javascript
小程序采集录音并上传到后台
2019/11/22 Javascript
JavaScript遍历数组的方法代码实例
2020/01/14 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
[01:03:50]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第二场 2月7日
2021/03/11 DOTA
Python中请使用isinstance()判断变量类型
2014/08/25 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
详解Python中的Lock和Rlock
2021/01/26 Python
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
Bjorn Borg官方网上商店:国际运动时尚品牌
2016/08/27 全球购物
应届行政管理专业个人自我评价
2013/12/28 职场文书
结对共建协议书
2014/08/20 职场文书
超强台风观后感
2015/06/09 职场文书
初中运动会前导词
2015/07/20 职场文书
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers