关于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 ...
随机推荐
- 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: ...
- Qt中图像的显示与基本操作
Qt可显示基本的图像类型,利用QImage.QPxmap类可以实现图像的显示,并且利用类中的方法可以实现图像的基本操作(缩放.旋转). 1. Qt可显示的图像类型 参考Qt的帮助文档,可支持的类型,即 ...
- 滴答数必须介于 DateTime.MinValue.Ticks 和 DateTime.MaxValue.Ticks 之
一个莫名其妙的问题:错误 滴答数必须介于 DateTime.MinValue.Ticks 和 DateTime.MaxValue.Ticks 之间. 参数名:ticks.这 网上找了很多,都没有一个正 ...
- [转]asp.net mvc 从数据库中读取图片
本文转自:http://www.cnblogs.com/mayt/archive/2010/05/20/1740358.html 首先是创建一个类,继承于ActionResult,记住要引用Syste ...
- UVa 11624 Fire!(BFS)
Fire! Time Limit: 5000MS Memory Limit: 262144KB 64bit IO Format: %lld & %llu Description Joe ...
- ArcGISDynamicMapServiceLayer 实现条件过滤
<html> <head> <meta http-equiv="Content-Type" content="text/html; ...
- 分布式文件系统FastDFS原理介绍
在生产中我们一般希望文件系统能帮我们解决以下问题,如:1.超大数据存储:2.数据高可用(冗余备份):3.读/写高性能:4.海量数据计算.最好还得支持多平台多语言,支持高并发. 由于单台服务器无法满足以 ...
- eclipse编译异常修正:the project cannot be built until its prerequisite...
close错误的project,重新open , 再 clean下 .
- PHP 计算出内存最高占用.
PHP 计算出内存最高占用. 代码可以计算出内存是否完全被使用, ini设置处:memory_limit = 1024M 代码跑完将显示如下信息: memory_limit:320M all ...
- Rails--%w用法[转]
%Q 用于替代双引号的字符串. 当你需要在字符串里放入很多引号时候, 可以直接用下面方法而不需要在引号前逐个添加反斜杠 (\") >> %Q(Joe said: "Fr ...