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 vvorld 在线加密破解方法
Nov 13 Javascript
js文件中调用js的实现方法小结
Oct 23 Javascript
javascript实现div浮动在网页最顶上并带关闭按钮效果实例
Aug 13 Javascript
javascript中RegExp保留小数点后几位数的方法分享
Aug 13 Javascript
js通过location.search来获取页面传来的参数
Sep 11 Javascript
js实现图片轮播效果
Dec 19 Javascript
基于jQuery实现仿微博发布框字数提示
Jul 27 Javascript
JS实现仿UC浏览器前进后退效果的实例代码
Jul 17 Javascript
JS中精巧的自动柯里化实现方法
Dec 12 Javascript
集成vue到jquery/bootstrap项目的方法
Feb 10 jQuery
vue中的数据绑定原理的实现
Jul 02 Javascript
优雅的在React项目中使用Redux的方法
Nov 10 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
destoon公司主页模板风格的添加方法
2014/06/20 PHP
Aster vs KG BO3 第一场2.19
2021/03/10 DOTA
Dojo 学习笔记入门篇 First Dojo Example
2009/11/15 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
JS实现程序暂停与继续功能代码解读
2013/10/10 Javascript
js单例模式的两种方案
2013/10/22 Javascript
alert和confirm功能介绍
2014/05/21 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
jQuery实现简单的日期输入格式化控件
2015/03/12 Javascript
在Node.js中使用Javascript Generators详解
2016/05/05 Javascript
js获取Html元素的实际宽度高度的方法
2016/05/19 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
详解JS中的attribute属性
2017/04/25 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
微信小程序使用 vant Dialog组件的正确方式
2020/02/21 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
[01:17]炒鸡美酒第四天TA暴走
2018/06/05 DOTA
Python实现图片滑动式验证识别方法
2017/11/09 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
利用css3径向渐变做一张优惠券的示例
2018/03/22 HTML / CSS
如何选择使用结构还是类
2014/05/30 面试题
学校志愿者活动总结
2014/06/27 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL
详解JS数组方法
2021/11/20 Javascript