首先说明一下,call()和apply都是js的内置函数

它的作用是:改变call或者apply函数里面的``第一个参数对象``的指针,使它转向引用它的函数

call()的用法,call(对象,参数1,参数2,······)

apply()的用法,apply(对象,数组参数)

call()和apply()的区别是:call对象后面的参数是字符串,而apply对象后面的参数是数组

换一句话就是说:改变第一个参数对象的this,使它指向引用它的函数

例子:
函数func.call(obj,arg2,arg3)
这个例子的意思就是:
call把第一个参数,obj对象的this指向func的this,并向func函数传递参数arg1,arg2

针对第一个参数obj,这里再解释一下:
【obj:这个是对象,也可以是函数,如果是函数,call方法最终会解析成``构成这个函数的对象``,有人也把这个说成是函数的上下文环境】
下面我们来做实验:

 //构建全局对象的add函数
function add(a,b){
alert(a+b);
}
var obj={ };
//构建以obj为对象的add函数,注意这里的函数体是: a*b,以表明与上面的add的不同
obj.add=function(a,b){
alert(a*b);
}
obj.sub=function(a,b){
alert(a/b);
}
//构建sub函数
function sub(a,b){
alert(a-b);
}
obj.arg1=function(){
alert(a%b);
}
obj.arg2=function(a,b){
alert(a%b);
}
function arg(){ }
//实验1
obj.add.call(add,1,2);//结果为:2
obj.add.call(window.add,1,2);//结果为:2
obj.add.call(window,1,2);//结果为:2
//实验2
add.call(obj.add,1,2);//结果为:3
add.call(obj,1,2);//结果为3
add.call(window,1,2);//结果为3
//实验3
sub.call(add,1,2);//结果为-1
sub.call(window.add,1,2);//结果为-1
sub.call(obj.add,1,2);//结果为-1
//实验4
add.call(sub,1,2);//结果为3
add.call(window.sub,1,2);//结果为3
add.call(obj.sub,1,2);//结果为3
//实验6
obj.call(sub,1,2);
//Uncaught TypeError: obj.call is not a function(anonymous function)
window.call(sub,1,2);
//Uncaught TypeError: window.call is not a function(anonymous function)
//实验7
obj.arg1.call(add,1,2);
//Uncaught ReferenceError: a is not defined
obj.arg2.call(arg,1,2);//结果:1

实验1、2、3、4、5、7作对照:

得出结论:call方法的第一个参数为对象,其余参数的为传进去``对象``方法里面的值

实验6:得出结论,call只是``函数``的一个方法,引用它的必须为``函数``,``对象``引用它会报错

结后语:

如果我上面的结论正确,那么下面的执行下面的函数和结果应该是:

obj.sub.call(sub,1,2);//结果:0.5
obj.sub.call(window.sub,1,2);//结果:0.5
obj.sub.call(window,1,2);//结果:0.5

大家可以做一下实验,以验证我的结论

关于js的call()和apply()两个函数的一点个人看法的更多相关文章

  1. js的call() ,apply() 两种方法的区别和用法,最白话文的解释,让枯燥滚粗!

    百度了一圈calll()函数和apply()函数,感觉还是糊里糊涂 正好我前几天刚又重新翻了一遍 那本 600多页 的圣经书,我习惯时不时的去打下基础,只是为了用来装逼,给人讲解....(我是有多蛋疼 ...

  2. js继承之call,apply和prototype随谈

    在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am jo ...

  3. JS中call、apply的用法说明

    JS Call()与Apply()的区别 ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是 ...

  4. js中call与apply用法

    call和apply,它们的作用都是将函数绑定到另外一个对象上去运行 两者的格式和参数定义: call( thisArg [,arg1,arg2,… ] ); // 参数列表,arg1,arg2,.. ...

  5. js中call和apply的实现原理

    js中call和apply的实现原理            实现call的思路: /* 还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法 (我门可 ...

  6. JS this,call和apply以及回调函数

    this this引用,引用的是一个对象,对象不同或函数调用方式的不同,this引用会根据代码的上下文语境自动改变引用对象的特性. 引用规则 1,在最外层代码中,this引用引用的是全局对象(wind ...

  7. js中call、apply、bind那些事

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  8. 原生js更改css样式的两种方式

    下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3  &quo ...

  9. js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别

    js中有两种声明函数的方法,分别为: var functionOne = function() { // Some code }; function functionTwo() { // Some c ...

随机推荐

  1. spark Mllib SVM实例

    Mllib SVM实例 1.数据 数据格式为:标签, 特征1 特征2 特征3…… 0 128:51 129:159 130:253 131:159 132:50 155:48 156:238 157: ...

  2. Qt中图像的显示与基本操作

    Qt可显示基本的图像类型,利用QImage.QPxmap类可以实现图像的显示,并且利用类中的方法可以实现图像的基本操作(缩放.旋转). 1. Qt可显示的图像类型 参考Qt的帮助文档,可支持的类型,即 ...

  3. 滴答数必须介于 DateTime.MinValue.Ticks 和 DateTime.MaxValue.Ticks 之

    一个莫名其妙的问题:错误 滴答数必须介于 DateTime.MinValue.Ticks 和 DateTime.MaxValue.Ticks 之间. 参数名:ticks.这 网上找了很多,都没有一个正 ...

  4. [转]asp.net mvc 从数据库中读取图片

    本文转自:http://www.cnblogs.com/mayt/archive/2010/05/20/1740358.html 首先是创建一个类,继承于ActionResult,记住要引用Syste ...

  5. UVa 11624 Fire!(BFS)

    Fire! Time Limit: 5000MS   Memory Limit: 262144KB   64bit IO Format: %lld & %llu Description Joe ...

  6. ArcGISDynamicMapServiceLayer 实现条件过滤

    <html>   <head>   <meta http-equiv="Content-Type" content="text/html; ...

  7. 分布式文件系统FastDFS原理介绍

    在生产中我们一般希望文件系统能帮我们解决以下问题,如:1.超大数据存储:2.数据高可用(冗余备份):3.读/写高性能:4.海量数据计算.最好还得支持多平台多语言,支持高并发. 由于单台服务器无法满足以 ...

  8. eclipse编译异常修正:the project cannot be built until its prerequisite...

    close错误的project,重新open , 再 clean下 .

  9. PHP 计算出内存最高占用.

    PHP 计算出内存最高占用.   代码可以计算出内存是否完全被使用, ini设置处:memory_limit = 1024M  代码跑完将显示如下信息: memory_limit:320M  all ...

  10. Rails--%w用法[转]

    %Q 用于替代双引号的字符串. 当你需要在字符串里放入很多引号时候, 可以直接用下面方法而不需要在引号前逐个添加反斜杠 (\") >> %Q(Joe said: "Fr ...