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 相关文章推荐
json 定义
Jun 10 Javascript
JQuery select标签操作代码段
May 16 Javascript
js打印纸函数代码(递归)
Jun 18 Javascript
jQuery选择没有colspan属性的td的代码
Jul 06 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
Apr 12 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
Dec 16 Javascript
jquery访问ashx文件示例代码
Aug 11 Javascript
JS实现消息来时让网页标题闪动效果的方法
Apr 20 Javascript
bootstrap配合Masonry插件实现瀑布式布局
Jan 18 Javascript
原生JS实现简单放大镜效果
Feb 08 Javascript
vue.js高德地图实现热点图代码实例
Apr 18 Javascript
Vue自定义表单内容检查rules实例
Oct 30 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的存储过程的实现代码
2008/08/12 PHP
php获取新浪微博数据API实例
2013/11/12 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
2014/04/09 PHP
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
js 操作select与option(示例讲解)
2013/12/20 Javascript
jquery操作复选框(checkbox)的12个小技巧总结
2014/02/04 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
JavaScript在Android的WebView中parseInt函数转换不正确问题解决方法
2015/04/25 Javascript
JavaScript图片轮播代码分享
2015/07/31 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
js实现图片切换(动画版)
2016/12/25 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
bootstrap+jquery项目引入文件报错的解决方法
2018/01/22 jQuery
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
[01:02:10]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第一局
2016/02/26 DOTA
[01:08:17]2018DOTA2亚洲邀请赛3月29日 小组赛B组 EG VS VGJ.T
2018/03/30 DOTA
python k-近邻算法实例分享
2014/06/11 Python
浅析python中numpy包中的argsort函数的使用
2018/08/30 Python
设置python3为默认python的方法
2018/10/31 Python
django的csrf实现过程详解
2019/07/26 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
Python3爬虫中识别图形验证码的实例讲解
2020/07/30 Python
python 调整图片亮度的示例
2020/12/03 Python
python使用dlib进行人脸检测和关键点的示例
2020/12/05 Python
Python读取pdf表格写入excel的方法
2021/01/22 Python
LINUX下线程,GDI类的解释
2012/04/17 面试题
大学生职业生涯规划方案
2014/01/03 职场文书
上班迟到检讨书
2014/01/10 职场文书
写给妈妈的道歉信
2014/01/11 职场文书
财务管理专业自荐书
2014/09/02 职场文书
水利专业大学生职业生涯规划书范文
2014/09/17 职场文书
班主任班级管理心得体会
2016/01/07 职场文书
python实现简易名片管理系统
2021/04/11 Python
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技