JS Call()与Apply()
JS Call()与Apply()
ECMAScript规范给所有函数都定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递给函数的值,call与apply的不同就是call传的值可以是任意的,而apply传的剩余值必须为数组。
例如:function add(a, b) { return a + b; }
function sub(a, b) { return a - b; }
/*apply用法
* var a1 = sub.apply(add, [4, 2]);
*var a2= add.apply(sub, [4, 2]);
*/
var a1 = sub.call(add, 4, 2);
var a2= add.call(sub, 4, 2);
输出:a1=2 a2=6
感觉还是有意未尽,更有意思的还在下面
js总是认为他是万能的,既然高级语言会继承,我js也不能示弱:JS模仿继承
function fun1() {
this.a = 123;
this.add = function () { return this.a }
}
function fun2() {
this.a = 456;
}
var f1=new fun1()
var f2=new fun2()
var a = f1.add.call(f2); // a输出的是456
这里就是把啊f1的方法拿给f2来使用,f2便可以使用f1中所有的方法,这不正是高级语言中继承的概念喽。当然根据综上可扩展出多继承,使用多个call便可以实现多继承
function fun1() {
this.add = function () { return this.a }
}
function fun2() {
this.sub = function () { return this.a-this.b }
}
function fun3() {
this.a = 10;
this.b = 2;
fun1.call(this);
fun2.call(this);
}
var f3 = new fun3()
alert(f3.add());
alert(f3.sub())
JS Call()与Apply()的更多相关文章
- JS 的 call apply bind 方法
js的call apply bind 方法都很常见,目的都是为了改变某个方法的执行环境(context) call call([thisObj[,arg1[, arg2[, [,.argN]]]] ...
- 深入理解js中的apply、call、bind
概述 js中的apply,call都是为了改变某个函数运行时的上下文环境而存在的,即改变函数内部的this指向. apply() apply 方法传入两个参数:一个是作为函数上下文的对象,另外一个是作 ...
- 如何用 js 实现一个 apply 函数
如何用 js 实现一个 apply 函数 原理 实现方式 总结 refs https://developer.mozilla.org/en-US/docs/Web/JavaScript/Referen ...
- js巧用apply方法实现数组最值以及合并
尽管js的apply方法在平常的使用中并不多见,但是在某些地方使用的还是很有帮助性的,这里就和大家说两个比较实用的例子:1.数组最大最小值 求数组中的最大最小值,js有相应的方法:Math.min() ...
- js call与apply方法
js中所有函数都默认定义了Call()与apply()两个方法,call与apply的第一个参数都是需要调用的函数对象,在函数体内这个参数就是this的值,剩余的参数是需要传递给函数的值,call与a ...
- js call()和apply()
一.call()和apply(),实例如下: function add(a,b) { alert(a+b); } function sub(a,b) { alert(a-b); } a ...
- js: this,call,apply,bind 总结
对js中的一些基本的很重要的概念做一些总结,对进一步学习js很重. 一.this JavaScript 中的 this 总是指向一个对象,而具体指向那个对象是在运行时基于函数的执行环境动态绑定的,而非 ...
- js call与apply的区别-Tom
.apply和.call方法是在函数原型中定义的两个方法(因此所有的函数都可以访问它)允许去手动设置函数调用的this值,他们用接受 的第一个参数作为this值,this 在调用的作用域中使用.这两个 ...
- js中的apply和call API
借用网上的一个例子: fun.call(this,arg1,arg2,arg3) fun.apply(this,arguments) this.fun(arg1,arg2,arg3) 三种方法等效. ...
随机推荐
- MVC3 Html.ActionLink
以下使用参数文字说明: linkText:生成的链接所显示的文字 类型:string actionName:对应控制器的方法 类型:string routeValues:向对应的action传递的 ...
- windows apache 配置多个服务 站点 Apache Service Monitor
把Apache安装为多个Window NT服务 ~~~ 可以在 services.msc中查看到1. 在DOS下跳到Apache安装目录里的bin目录(~~~或者用path命令 把apache的安装目 ...
- 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串
LCS:给出两个序列S1和S2,求出的这两个序列的最大公共部分S3就是就是S1和S2的最长公共子序列了.公共部分 必须是以相同的顺序出现,但是不必要是连续的. 选出最长公共子序列.对于长度为n的序列, ...
- switf资源
http://www.swiftv.cn/ http://letsswift.com/
- 【Android】: 部分注意事项
1.用来触发BroadcastReceive的Intent和启动Activity或Service的Intent是不兼容的. 2.当文件名做为ContentProvider查询的一部分返回的时候,不应该 ...
- 关于JAVA 向上转型
最近复习中比较绕的一个地方 通过试验总结一下 若A为父类 B为子类 声明方式为: A t= new B(); 将子类对象赋值给父类对象,它编译时为父类对象,但运行时却是子类对象: 1)被声明为父类对象 ...
- poj 1035 Spell checker(hash)
题目链接:http://poj.org/problem?id=1035 思路分析: 1.使用哈希表存储字典 2.对待查找的word在字典中查找,查找成功输出查找成功信息 3.若查找不成功,对word增 ...
- 搭建你的持续集成server - CruiseControl step by step(1)
CruiseControl是CIserver的老者,诞生已是多年,在很多方面,CruiseControlserver已经成为持续集成实践的同义词.而如今,CruiseControl已发展成为一个家族式 ...
- Java程序如何自动在线升级
有时候我们的程序需要连接服务器检测新版本,如果发现新版本则需要自动下载升级.这种需求在Linux下还好说,但在windows下如何替换正在运行的程序文件呢? 当然有办法,步骤如下: 1. 将我们的程序 ...
- hdu 5057 Argestes and Sequence
Argestes and Sequence Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...