关于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 ...
随机推荐
- Centos下设置静态IP
使用VirtualBox装了很多虚拟机,默认采用的DHCP的方式,但是随着虚拟机越来越多以后,这种方式很不方便,所以需要将机器的IP都设置为静态IP 需要添加的几项内容的解释:IPADDR IP ...
- Eclipse @override报错解决
第一种解决方案: @Override是JDK5 就已经有了,但有个小小的Bug,就是不支持对接口的实现,认为这不是Override 而JDK6 修正了这个Bug,无论是对父类的方法覆盖还是对接口的实现 ...
- css样式表:样式分类,选择器。样式属性,格式与布局
样式表分类: 1.内联样式表, 和html联合显示,例:<p style="font-size:14px;">内联样式表</p> 2.内嵌样式表 作为一个独 ...
- 让input不可编辑的方法
两种方法: disabled="true " 文字会变成灰色,不可编辑. readOnly="true" 文字不会变色,也是不可编辑的 <input na ...
- https的了解
经常用支付宝,看到了https就查了一下. HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议. 简单讲是HTTP的安全版.即HTTP下加入SSL层, ...
- [Delphi]Delphi开发的一些技巧
一.提高查询效率先进行准备查询操作: CustomerQuery.Close; if not (CustomerQuery.Prepared) then -->查询是否已准备好 Customer ...
- 【液晶模块系列基础视频】5.2.X-GUI字体驱动2
============================= 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:ht ...
- “通过jumpserver远程登录linux服务器,rz上传文件速度过慢”问题的解决
问题: windows通过jumpserver远程登录到linux服务器,使用rz上传jar包,速度太慢(10k以内). 解决方案: 思路:通过ssh直接登录远程服务器 1.secureCRT-> ...
- Android 调用资源字符串的几种方法
在 Layout XML 调用字符串资源: <TextView android:layout_width="fill_parent" android:layout_heigh ...
- Centos 6.4 python 2.6 升级到 2.7
Centos 6.4 python 2.6 升级到 2.7 分类: Python Linux2013-09-13 21:35 37278人阅读 评论(2) 收藏 举报 一开始有这个需求,是因为用 Ya ...