JavaScript中call和apply方法的区别实例分析


Posted in Javascript onAugust 03, 2018

本文实例分析了JavaScript中call和apply方法的区别。分享给大家供大家参考,具体如下:

这两个方法不经常用,但是在某些特殊场合中是非常有用的,下面主要说下它们的区别:

1、首先,JavaScript是一门面向对象的语言,也就是说它有this的概念。而且JavaScript是一门动态类型语言,为什么说它是动态类型语言呢?因为JavaScript在编译时没有类型检查的过程,不会去检查创建的对象类型,也不会去检查传递的参数类型,所以它的变量类型在运行期间是可以改变的。

2、要知道callapply都是为了改变某个函数运行时的上下文(context)而存在的,也就是为了改变函数,也可以说是对象(函数本身就是对象)内部this的指向而存在的。

3、二者区别为:传参数的方式不一样,如下:

func.call(this, arg1, arg2);
func.apply(this, [arg1, arg2]);

上面也很清楚了,call传参数时,明确知道时几个参数或者参数较少时,比如arg1arg2,挨个传就是了;

apply第二个参数必须为一个数组,即将参数放进数组中即可。

4、实例

(function(){
 Array.prototype.push.call(arguments, 4);//arguments借用Array.prototype.push方法
 console.log( arguments ); //输出: [1, 2, 3, 4]
})(1, 2, 3);
var currying = function(fn){
  var args = [];
  return function(){
    if( arguments.length === 0){
      return fn.apply( this, args);
    }
    else{
      [].push.apply( args, arguments);
      return arguments.callee; //callee已弃用
    }
  }
};
var cost = (function(){
 var money = 0;
 return function(0{
   for(var i = 0,l - arguments.length;i<l;i++){
     money += arguments[i];
   }
   return money;
 }
})();

调用:

var cost_ = currying(cost); //将cost转化成curring函数
cost_(1); cost_(2); alert(cost_()); //输出:3

解释:通过currying(柯里化)的转化,在cost_中传入参数时,未能得到值,而是将值存储起来,直到当无参数传入时,输出结果。

更多关于JavaScript相关内容可查看本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Add Formatted Text to a Word Document
Jun 15 Javascript
JS+XML 省份和城市之间的联动实现代码
Oct 14 Javascript
Jquery+asp.net后台数据传到前台js进行解析的方法
May 11 Javascript
jquery中获得元素尺寸和坐标的方法整理
May 18 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
Mar 01 Javascript
原生js和jquery分别实现横向导航菜单效果
May 13 Javascript
纯js三维数组实现三级联动效果
Feb 07 Javascript
Base64(二进制)图片编码解析及在各种浏览器的兼容性处理
Feb 09 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
Jul 17 jQuery
Bootstrap Table 双击、单击行获取该行及全表内容
Aug 31 Javascript
vue-quill-editor插入图片路径太长问题解决方法
Jan 08 Vue.js
Axios取消重复请求的方法实例详解
Jun 15 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
Aug 03 #Javascript
关于js对textarea换行符的处理方法浅析
Aug 03 #Javascript
webpack4 + react 搭建多页面应用示例
Aug 03 #Javascript
使用JS代码实现俄罗斯方块游戏
Aug 03 #Javascript
小程序tab页无法传递参数的方法
Aug 03 #Javascript
详解Webpack多环境代码打包的方法
Aug 03 #Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
Aug 03 #jQuery
You might like
Views rows style模板重写代码
2011/05/16 PHP
header跳转和include包含问题详解
2012/09/08 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
2016/06/20 PHP
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
JS 弹出层 定位至屏幕居中示例
2014/05/21 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
原生javascript实现解析XML文档与字符串
2016/03/01 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
jQuery插件实现图片轮播特效
2016/06/16 Javascript
jQuery EasyUI常用数据验证汇总
2016/09/18 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
vue toggle做一个点击切换class(实例讲解)
2018/03/13 Javascript
Node.js 使用jade模板引擎的示例
2018/05/11 Javascript
vue实现随机验证码功能的实例代码
2019/04/30 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
Nuxt 项目性能优化调研分析
2020/11/07 Javascript
JavaScript实现HTML导航栏下拉菜单
2020/11/25 Javascript
Vue router安装及使用方法解析
2020/12/02 Vue.js
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
使用python实现链表操作
2018/01/26 Python
python中logging包的使用总结
2018/02/28 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python实现翻译word表格小程序
2020/02/27 Python
python输出结果刷新及进度条的实现操作
2020/07/13 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
Django celery异步任务实现代码示例
2020/11/26 Python
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
大学生文员专业个人求职信范文
2014/01/05 职场文书
买卖车协议书
2014/04/21 职场文书
医学检验专业自荐信
2014/09/18 职场文书
导游词之无锡梅园
2019/11/28 职场文书