JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别。

先来看看JS手册中对call的解释:

call 方法
调用一个对象的一个方法,以另一个对象替换当前对象。call([thisObj[,arg1[, arg2[,   [,.argN]]]]])参数
thisObj
可选项。将被用作当前对象的对象。arg1, arg2,  , argN
可选项。将被传递方法参数序列。说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

说明白一点其实就是更改对象的内部指针,即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。

引用网上一个代码段,运行后自然就明白其道理。

<input type="text" id="myText"   value="input text">
<script>function Obj(){this.value="对象!";}var value="global 变量";function Fun1(){alert(this.value);}window.Fun1();   //global 变量Fun1.call(window);  //global 变量Fun1.call(document.getElementById('myText'));  //input textFun1.call(new Obj());   //对象!
</script>

call函数和apply方法的第一个参数都是要传入给当前对象的对象,及函数内部的this。后面的参数都是传递给当前对象的参数。
运行如下代码:

<script>var func=new function(){this.a="func"}var myfunc=function(x){var a="myfunc";alert(this.a);alert(x);}myfunc.call(func,"var");
</script>

可见分别弹出了func和var。到这里就对call的每个参数的意义有所了解了。

对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:

apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。

如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入。

如下面代码所示:

function print(a, b, c, d){alert(a + b + c + d);
}
function example(a, b , c , d){//用call方式借用print,参数显式打散传递print.call(this, a, b, c, d);//用apply方式借用print, 参数作为一个数组传递,//这里直接用JavaScript方法内本身有的arguments数组print.apply(this, arguments);//或者封装成数组print.apply(this, [a, b, c, d]);
}
//下面将显示”背光脚本”

example(”背” , “光” , “脚”, “本”);

最后一句由于直接调用example方法, 所以在该方法中的上下文对象this就是window对象.

所以,call, apply方法它们除了第一个参数,即执行时上下文对象相同外,call方法的其它参数将依次传递给借用的方法作参数,而apply就两个参数,第二个参数为一个数组传递.所以可以说成

call, apply方法区别是,从第二个参数起, call方法参数将依次传递给借用的方法作参数, 而apply直接将这些参数放到一个数组中再传递, 最后借用方法的参数列表是一样的.

转载于:https://www.cnblogs.com/SherryIsMe/p/4330922.html

关于JavaScript中apply与call的用法意义及区别(转)相关推荐

  1. [转] 深入浅出 妙用Javascript中apply、call、bind

    [From] http://www.admin10000.com/document/6711.html 网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.ca ...

  2. 深入Javascript中apply、call、bind

    最近在看一下node package的源码,发现很多里面都包含了function这个对象的apply.call.bind这三个方法,于是想拿出来再看看.. apply.call 在 javascrip ...

  3. 【优雅代码】深入浅出 妙用Javascript中apply、call、bind

    这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: "对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂 ...

  4. JavaScript 中 apply 、call 的详解

    apply 和 call 的区别 ECMAScript 规范给所有函数都定义了 call 与 apply 两个方法,它们的应用非常广泛,它们的作用也是一模一样,只是传参的形式有区别而已. 原文作者:林 ...

  5. 深入浅出妙用 Javascript 中 apply、call、bind

    这篇文章实在是很难下笔,因为网上相关文章不胜枚举. 巧合的是前些天看到阮老师的一篇文章的一句话: "对我来说,博客首先是一种知识管理工具,其次才是传播工具.我的技术文章,主要用来整理我还不懂 ...

  6. Javascript 中 apply、call、bind

    在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向. JavaScript 的一大 ...

  7. 关于javascript中apply()和call()方法

    ref:http://www.popo4j.com/article/the-differences-of-apply-and-call.html 如果没接触过动态语言,以编译型语言的思维方式去理解ja ...

  8. javascript中apply、call和bind的区别

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢. 在说区别之前还是先总结一下三者的相似之处: 1.都是用来改变函数的this对象的指向的. 2.第一个参数都是this要指 ...

  9. JavaScript中的单引号和双引号的区别

    JavaScript中的单引号和双引号其实没啥区别,看你自己习惯了.但若双引号中再使用双引号,我们可采取"外双内单"或者"外单内双"的格式:如果需要的是双引号本 ...

  10. javascript中var、let、const声明的区别

    我在上一篇文章javascript中词法环境.领域.执行上下文以及作业详解中的最后稍微提到了有关var.let.const声明的区别,在本篇中我会重点来分析它们之间到底有什么不同. 提到var.let ...

最新文章

  1. [JS] for-each和map()的区别
  2. pandas使用replace函数替换dataframe中的值:replace函数使用正则表达式对dataframe中的值进行替换
  3. 8.2 高斯分布模型-机器学习笔记-斯坦福吴恩达教授
  4. dw1000 配置无法通过
  5. PDF转Word技巧,看这篇足够
  6. 蜗牛慢慢爬 LeetCode 6. ZigZag Conversion [Difficulty: Medium]
  7. 弱引用的用途:在底层C++对象被上层python脚本对象使用时(转)
  8. DLL入门浅析(4)——从DLL中导出类
  9. [转]让.NET应用秒变微服务
  10. Hexo 博客自定义一个不使用主题模板渲染的独立页面
  11. 编写一个UNIX文件系统
  12. C语言动态规划——背包问题详解
  13. 计算机排版自然段视频教程,排版教程(新手电脑排版教程视频)
  14. 人工智能-基于规则的专家系统(基础知识)
  15. access转sql iif_Access中IIF,SWITCH,CHOOSE的使用技巧
  16. PC浏览器无法浏览网页的解决教程
  17. [安卓开发] Broadcast 三种广播的使用总结
  18. Problem solved list
  19. 抖音开放平台, 企业号私信订阅服务 java(公开的)
  20. Can't create/write to file '/tmp/MYmZiY2i' 报错解决方法

热门文章

  1. Java编程实现获取本机IP和计算机名的功能
  2. Java 开发必备,EasyExcel 操作详解!
  3. ASP.NET MVC 不能加载项目的解决办法
  4. 第一个Eureka Service
  5. c bool 类型检查_第3篇:C/C++ 检查数字类型的最高有效位(MSB)
  6. 服务器软件是否支持双机热备,服务器双机热备建议方案.doc
  7. html元素拖动互换位置原理,HTML5 元素拖动 - 实现元素左右拖动, 或更改自身排序...
  8. Idea:新版本Idea底部工具栏Git中没有Local Changes
  9. sql2005 脚本中给字段写说明
  10. C语言中基础数据类型的取值范围——整型溢出问题