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 相关文章推荐
js arguments,jcallee caller用法总结
Nov 30 Javascript
javascript删除数组重复元素的方法汇总
Jun 24 Javascript
jQuery检测返回值的数据类型
Jul 13 Javascript
js获取元素的标签名实现方法
Oct 08 Javascript
vue的props实现子组件随父组件一起变化
Oct 27 Javascript
Vue实现路由跳转和嵌套
Jun 20 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
Jul 13 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
Sep 20 jQuery
Node中使用ES6语法的基础教程
Jan 05 Javascript
JS实现集合的交集、补集、差集、去重运算示例【ES5与ES6写法】
Feb 18 Javascript
详解Webpack抽离第三方类库以及common解决方案
Mar 30 Javascript
JavaScript分页组件使用方法详解
Jul 26 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模板引擎SMARTY
2006/10/09 PHP
两种php调用Java对象的方法
2006/10/09 PHP
一些常用的php函数
2006/12/06 PHP
php权重计算方法代码分享
2014/01/09 PHP
php操作mongoDB实例分析
2014/12/29 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
PHP进阶学习之类的自动加载机制原理分析
2019/06/18 PHP
javascript 获取图片颜色
2009/04/05 Javascript
jQuery源码分析-05异步队列 Deferred 使用介绍
2011/11/14 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
解决jQuery uploadify在非IE核心浏览器下无法上传
2015/08/05 Javascript
JQuery zClip插件实现复制页面内容到剪贴板
2015/11/02 Javascript
JavaScript File API文件上传预览
2016/02/02 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
es6的数字处理的方法(5个)
2017/03/16 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
使用canvas进行图像编辑的实例
2017/08/29 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
JS实现根据数组对象的某一属性排序操作示例
2019/01/14 Javascript
JS实现的贪吃蛇游戏案例详解
2019/05/01 Javascript
js实现移动端吸顶效果
2020/01/08 Javascript
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
Python 数据结构之旋转链表
2017/02/25 Python
Selenium之模拟登录铁路12306的示例代码
2020/07/31 Python
HTML5 localStorage使用总结
2017/02/22 HTML / CSS
阿迪达斯加拿大官网:Adidas加拿大
2016/08/25 全球购物
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
澳大利亚排名第一的狂热牛仔品牌:ONETEASPOON
2018/11/20 全球购物
澳大利亚设计师服装在线:MISHA
2019/10/07 全球购物
美国在线购买内衣网站:HerRoom
2020/02/22 全球购物
教师求职信
2014/06/17 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
辩论会主持词
2015/07/03 职场文书