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 相关文章推荐
JavaScript 无符号右移赋值操作
Apr 17 Javascript
javascript 设置某DIV区域内的checkbox复选框
Nov 30 Javascript
Jquery Post处理后不进入回调的原因及解决方法
Jul 15 Javascript
jquery分割字符串的方法
Jun 24 Javascript
Nginx上传文件全部缓存解决方案
Aug 17 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
Feb 02 Javascript
每日十条JavaScript经验技巧(一)
Jun 23 Javascript
jQuery动态改变多行文本框高度的方法
Sep 07 Javascript
微信小程序 实现动态显示和隐藏某个控件
Apr 27 Javascript
vue.js异步上传文件前后端实现代码
Aug 22 Javascript
微信小程序视图template模板引用的实例详解
Sep 20 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
Nov 04 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
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
php实现的百度搜索某地天气的小偷代码
2014/04/23 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
ie下动态加态js文件的方法
2011/09/13 Javascript
基于jquery的一个拖拽到指定区域内的效果
2011/09/21 Javascript
40款非常有用的 jQuery 插件推荐(系列一)
2011/12/21 Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
2012/03/01 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
js实现tab切换效果
2017/02/16 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
Vue如何使用混合Mixins和插件开发详解
2020/02/05 Javascript
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
Python及PyCharm下载与安装教程
2017/11/18 Python
python selenium 对浏览器标签页进行关闭和切换的方法
2018/05/21 Python
Python实现iOS自动化打包详解步骤
2018/10/03 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
2019/01/15 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python这样操作能存储100多万行的xlsx文件
2019/04/16 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
css3翻牌翻数字的示例代码
2020/02/07 HTML / CSS
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
八一建军节部队活动方案
2014/02/04 职场文书
毕业生个人求职自荐信
2014/02/26 职场文书
自我鉴定标准格式
2014/03/19 职场文书
校庆活动方案
2014/03/31 职场文书
产品委托授权书范本
2014/09/16 职场文书
教你怎么用Python处理excel实现自动化办公
2021/04/30 Python
LayUI+Shiro实现动态菜单并记住菜单收展的示例
2021/05/06 Javascript