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 相关文章推荐
filemanage功能中用到的lib.js
Apr 08 Javascript
jquery HotKeys轻松搞定键盘事件代码
Aug 30 Javascript
通过一段代码简单说js中的this的使用
Jul 23 Javascript
js和php如何获取当前url的内容
Sep 22 Javascript
Jquery的基本对象转换和文档加载用法实例
Feb 25 Javascript
深入探究使JavaScript动画流畅的一些方法
Jun 30 Javascript
JavaScript编写带旋转+线条干扰的验证码脚本实例
May 30 Javascript
Angular+Node生成随机数的方法
Jun 16 Javascript
vuex 的简单使用
Mar 22 Javascript
django中使用vue.js的要点总结
Jul 07 Javascript
node.js实现上传文件功能
Jul 15 Javascript
微信小程序自定义支持图片的弹窗
Dec 21 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常用函数汇总
2014/12/17 PHP
php获取QQ头像并显示的方法
2014/12/23 PHP
php使用simplexml_load_file加载XML文件并显示XML的方法
2015/03/19 PHP
学习php设计模式 php实现观察者模式(Observer)
2015/12/09 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
任意位置显示html菜单
2007/02/01 Javascript
JS实现金额转换(将输入的阿拉伯数字)转换成中文的实现代码
2013/09/30 Javascript
js实现顶部可折叠的菜单工具栏效果实例
2015/05/09 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
js操作浏览器的参数方法
2017/01/21 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
vue2.0之多页面的开发的示例
2018/01/30 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
vue动态路由:路由参数改变,视图不更新问题的解决
2019/11/05 Javascript
[55:44]完美世界DOTA2联赛决赛 FTD vs Phoenix 第二场 11.08
2020/11/11 DOTA
在Docker上开始部署Python应用的教程
2015/04/17 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
Python+threading模块对单个接口进行并发测试
2019/06/25 Python
python爬虫之快速对js内容进行破解
2019/07/09 Python
Python使用Pandas对csv文件进行数据处理的方法
2019/08/01 Python
对Django 转发和重定向的实例详解
2019/08/06 Python
Python autoescape标签用法解析
2020/01/17 Python
Python中文分词库jieba,pkusegwg性能准确度比较
2020/02/11 Python
在python3中使用shuffle函数要注意的地方
2020/02/28 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
AmazeUI 加载进度条的实现示例
2020/08/20 HTML / CSS
销售目标责任书
2014/07/23 职场文书
2014年前台个人工作总结
2014/11/14 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
python百行代码实现汉服圈图片爬取
2021/11/23 Python