在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. 委托、匿名方法、Lambda表达式的演进

    摘自:"http://www.cnblogs.com/eagle1986/archive/2012/01/19/2327358.html 假设给我们一个泛型对象List<T>,T ...

  2. hdu 4828 Grids 卡特兰数+逆元

    Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Problem D ...

  3. c How to Make an Ascii Picture.

    import java.io.*; public class trans{ public static void main(String[] args){ try{ File inFile = new ...

  4. linux学习笔记2-命令总结1

    计划一个长期过程系统学习linux,这是本周学习总结,如果错误望指出纠正. 文件处理命令 命令格式与目录处理命令  ls 目录处理命令  cd  cp  mkdir  mv  pwd  rm  rmd ...

  5. 08 高效的SQL

    编写高效 SQL 需要以下知识 有关所查询内容的物理组织的知识 数据库能做什么的知识, 例如: 如果你不知道跳跃扫描索引及其用途, 那么你可能会看着模式说”索引丢了” SQL 所有错综复杂的知识 对目 ...

  6. Python学习(15)文件/IO

    目录 Python 文件I/O 打印到屏幕 读取键盘输入 打开和关闭文件 File对象属性 文件定位 重命名和删除文件 Python的目录 Python 文件I/O 本章只讲述所有基本的的I/O函数, ...

  7. Java List实体类去重

    版权声明:本文为博主原创文章,未经博主允许不得转载. List特点:元素有放入顺序,元素可重复 Map特点:元素按键值对存储,无放入顺序 Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入 ...

  8. 面向对象的static关键字(类中的static关键字)

    转自:http://blog.csdn.net/xiayefanxing/article/details/7382192 http://www.cnblogs.com/SelaSelah/archiv ...

  9. Android_用户界面概述和数据单位

    一.UI界面概述 UI,对于一个应用而言用户界面是非常重要的一部分,是应用的脸,用户对应用第一个印象来自于界面,因此如果没有完美的用户界面,很难留住用户. 好的用户界面会极大提高用户的使用欲望并维护客 ...

  10. Supervisor 守护 dotnetcore 程序

    版权声明:本文由屈政斌原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/240 来源:腾云阁 https://www.qclo ...