关于js的call()和apply()两个函数的一点个人看法
首先说明一下,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()两个函数的一点个人看法的更多相关文章
- js的call() ,apply() 两种方法的区别和用法,最白话文的解释,让枯燥滚粗!
百度了一圈calll()函数和apply()函数,感觉还是糊里糊涂 正好我前几天刚又重新翻了一遍 那本 600多页 的圣经书,我习惯时不时的去打下基础,只是为了用来装逼,给人讲解....(我是有多蛋疼 ...
- js继承之call,apply和prototype随谈
在js中,call,apply和prototype都可以实现对象的继承,下面我们看一个例子: function FatherObj1() { this.sayhello = "I am jo ...
- JS中call、apply的用法说明
JS Call()与Apply()的区别 ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是 ...
- js中call与apply用法
call和apply,它们的作用都是将函数绑定到另外一个对象上去运行 两者的格式和参数定义: call( thisArg [,arg1,arg2,… ] ); // 参数列表,arg1,arg2,.. ...
- js中call和apply的实现原理
js中call和apply的实现原理 实现call的思路: /* 还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法 (我门可 ...
- JS this,call和apply以及回调函数
this this引用,引用的是一个对象,对象不同或函数调用方式的不同,this引用会根据代码的上下文语境自动改变引用对象的特性. 引用规则 1,在最外层代码中,this引用引用的是全局对象(wind ...
- js中call、apply、bind那些事
前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...
- 原生js更改css样式的两种方式
下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3 &quo ...
- js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别
js中有两种声明函数的方法,分别为: var functionOne = function() { // Some code }; function functionTwo() { // Some c ...
随机推荐
- NHibernate's inverse - what does it really mean?
NHibernate's concept of 'inverse' in relationships is probably the most often discussed and misunder ...
- 过滤html字符的方法
昨天在看公司网站的产品详细页面,发现只有一个公司的JS产品轮换特效不会出,找了半天,程序都是一样的,原因是什么呢?原来是公司的别名是xiandahg,里面含有and字符被过滤掉了. public st ...
- 数据库SQL及相关
//1.生成随机数 ROUND(((89 - 71 -1) * RAND() + 71), 0) DECLARE @Result INT DECLARE @Upper INT DECLARE @Low ...
- filesize返回的是以字节为单位的数据也可以使之处理数字
1.文件的属性信息获取 首先文件具有类型,在linux下边,有block(块设备,如磁盘分区.CD-ROM).char(以字符为输入的设备,如键盘.打印机).dir(目录类型,目录也是文件的一种).f ...
- 使用SimpleXML应该注意的问题有哪些?
SimpleXML提供了一套简单快速的XML操作方法,大大地提高了XML操作的效率. 但是有时不小心也会带来不小的麻烦,看下面一段代码: $xml=simplexml_load_string('< ...
- PHP对于Session漏洞的防范
目前,基于PHP的网站开发已经成为目前网站开发的主流,本文笔者重点从PHP网站攻击与安全防范方面进行探究,旨在减少网站漏洞,希望对大家有所帮助! 一.常见PHP网站安全漏洞 对于PHP的漏洞,目前常见 ...
- php的源代码包构建一个空的php扩展。
下载一个php的源代码包,这里使用的是php 4.0.5版,解压后会看到php的根目录下会有README.EXT_SKEL这样一个文件,打开详细阅读了一下,发现了一个非常好用的工具,这个工具可以帮你构 ...
- MongoDB命令模式下的条件过滤总结
db.tb1.find() //查询全部,用it查看下一页.db.tb1.find({"age":1}) //查询年龄==1的记录db.tb1.find({},{"age ...
- 用命令行导出和导入MySQL数据库
php 用命令行导出和导入MySQL数据库 命令行导出数据库:1,进入MySQL目录下的bin文件夹:cd MySQL中到bin文件夹的目录如我输入的命令行:cd C:\Program Files ...
- markdown 书写表格
Tables Are Cool col 3 is right-aligned $1600 col 2 is centered $12 zebra stripes are neat $1 Refs ma ...