在JavaScript中改变闭包中的this关键字中经常用到的就是call和apply了

首先:call和apply的作用的区别是什么?

答:call和apply 的作用是相同的。都是用来改变函数this值以及对函数传递相应的参数。区别是他们传值不同,call是一个一个的参数进行传值,即以散列的方式传值;而apply则是把所有的参数放到一个数组中,只传这个数组就足够了。。

应用:在js中我们经常会用到数组的一些方法。但是类数组的形式却不能直接用数组的方法。那么我们就可以利用call和apply方法来间接的使用数组Array的方法

enter code here                                                                                  
var ary=[{name:"gudaochuan",age:22},{name:"super",age:48},{name:"man",age:38}];
console.log([].sort.call(ary,function(a,b){return a.age-b.age;}));

以下是上面数组输出的结果:

下面是一道面试题:据说是以前金山出的,现在应该没有这道题了:

function fn1(){alert(1)};

function fn2(){alert(2)};

fn3=fn2.call; 
fn2.call(fn1);
//请问输出什么结果,为什么

fn3.call(fn1);//请问输出什么结果,为什么

fn2.call(fn1);这个没有什么可说的。fn2里面没有this,所以这里call(fn1)没什么意义。就相当于直接调用fn2()方法,弹出2

主要是下面这个

fn3=fn2.call;

fn3.call(fn1);

fn3=fn2.call是什么意思呢?

*1.*call是定义在原型上的方法。所以说fn2.call只是这个call方法的定义......就和普通的一个方法的定义没有区别。所以fn2.call==fn3==Function.protoType.call

Function.protoType.call是方法原型上的call方法

所以fn3=fn1.call=fn2.call

*2.*fn2.call(null); 这里fn2的this是谁, call里的this是谁

fn2里面的this被强制转换成null了。call里的this就是fn2

*3.*call是function类型的 call是原型的方法所以call是function类型的

所以 call可以调用call方法

fn3.call(fn1)==Function.call.call(fn1);

最后一个注意的地方是:类上的方法this是谁就相当于谁在调用这个方法。所以说

Function.call.call(fn1);

Function.call 它里面的this指向fn1那么就相当于fn1.call

那么fn3.call(fn1); 弹出1

关于call和apply的那点事儿的更多相关文章

  1. call,apply,bind

    一.call&apply call, apply都属于Function.prototype的方法,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法 ...

  2. 关于浏览器cookie的那些事儿

    昨天接到一个小需求,就是在ipad上访问某页面,页面顶部出现一个下载客户端的提示,点击关闭按钮后,提示信息消失,信息存入cookie,在cookie未过期之前,除非用户自己清除浏览器的cookie,否 ...

  3. js面向对象之继承那点事儿根本就不是事

    继承 说道这个继承,了解object-oriented的朋友都知道,大多oo语言都有两种,一种是接口继承(只继承方法签名):一种是实现继承(继承实际的方法) 奈何js中没有签名,因而只有实现继承,而且 ...

  4. 你不知道的JavaScript--Item16 for 循环和for...in 循环的那点事儿

    大家都知道在JavaScript中提供了两种方式迭代对象: for 循环: for..in循环: 1.for循环 不足: 在于每次循环的时候数组的长度都要去获取: 终止条件要明确: 在for循环中,你 ...

  5. 你不知道的JavaScript--Item9 call(),apply(),bind()与回调

    1.call(),apply(),bind()方法 JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定 ...

  6. ES5和ES6那些你必须知道的事儿(三)

    ES5和ES6那些你必须知道的事儿 ES6新增的东西 一.块级作用域:关键字let,常量const let与var的区别: a.不会进行变量声明提升 b.变量不允许被重复定义 c.变量不允许被删除 d ...

  7. 转:SQL 关于apply的两种形式cross apply 和 outer apply

    原文地址:http://www.cnblogs.com/Leo_wl/archive/2013/04/02/2997012.html SQL 关于apply的两种形式cross apply 和 out ...

  8. SQL 关于apply的两种形式cross apply 和 outer apply, with cube 、with rollup 和 grouping

    1). apply有两种形式: cross apply 和 outer apply先看看语法: <left_table_expression> {cross|outer} apply &l ...

  9. JavaScript的Proxy可以做哪些有意思的事儿

    摘要: 神奇而有趣的Proxy. 原文:拿Proxy可以做哪些有意思的事儿 作者:贾顺名 Fundebug经授权转载,版权归原作者所有. Proxy是什么 首先,我们要清楚,Proxy是什么意思,这个 ...

随机推荐

  1. Quartz.Net 调度框架配置介绍

    在平时的工作中,估计大多数都做过轮询调度的任务,比如定时轮询数据库同步,定时邮件通知等等.大家通过windows计划任务,windows服务等都实现过此类任务,甚至实现过自己的配置定制化的框架.那今天 ...

  2. 转 Cocos网络篇[3.2](3) ——Socket连接(1)

    Cocos网络篇[3.2](3) ——Socket连接(1) 2015-03-05 22:24:13 标签:network http socket cocos [唠叨] 在客户端游戏开发中,使用HTT ...

  3. 手机如何解散QQ讨论组

    手机如何解散QQ讨论组   讨论组可以方便一群人的聊天,一般都是一段时间的问题.过了这一段时间,大家都是不需要再在讨论组里面发言了,那么手机如何解散QQ讨论组呢?     1 我们登录自己的 QQ之后 ...

  4. nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

    参照网址: [1]http://blog.csdn.net/redstarofsleep/article/details/45092147 [2]HLS介绍:http://www.cnblogs.co ...

  5. [转载] [Mark]分布式存储必读论文

    原文: http://50vip.com/423.html 分布式存储泛指存储存储和管理数据的系统, 与无状态的应用服务器不同, 如何处理各种故障以保证数据一致,数据不丢, 数据持续可用, 是分布式存 ...

  6. SQL 调优专题总结

    oracle 的优化器: oracle 有两种优化器:基于规则的优化器(rbo/rule based optimizer)和基于代价的优化器(cbo/cost based optimizer). 有时 ...

  7. 使用poi读写Excel

    对于一个程序员来说,文件操作是经常遇到的,尤其是对Excel文件的操作. 在这里介绍一下我在项目中用到的一个操作Excel的工具——POI.关于POI的一些概念,网络上很多,详细信息大家可以自行百度, ...

  8. Android软键盘弹出时把布局顶上去的解决方法

    原文: 解决Andriod软键盘出现把原来的布局给顶上去的方法(转) 链接:http://blog.sina.com.cn/s/blog_9564cb6e0101g2eb.html 决方法,在main ...

  9. Sqlserver_left join 、right join、 inner join 用法

    left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录inner join(等值连接) 只 ...

  10. dshow,Sample Grabber 从摄像头采集

    char* CCameraDS::QueryFrame() { long evCode, size = 0; #if CALLBACKMODE static double lastSampleTime ...