关于call和apply的那点事儿
在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的那点事儿的更多相关文章
- call,apply,bind
一.call&apply call, apply都属于Function.prototype的方法,因为属于Function.prototype,所以每个Function对象实例,也就是每个方法 ...
- 关于浏览器cookie的那些事儿
昨天接到一个小需求,就是在ipad上访问某页面,页面顶部出现一个下载客户端的提示,点击关闭按钮后,提示信息消失,信息存入cookie,在cookie未过期之前,除非用户自己清除浏览器的cookie,否 ...
- js面向对象之继承那点事儿根本就不是事
继承 说道这个继承,了解object-oriented的朋友都知道,大多oo语言都有两种,一种是接口继承(只继承方法签名):一种是实现继承(继承实际的方法) 奈何js中没有签名,因而只有实现继承,而且 ...
- 你不知道的JavaScript--Item16 for 循环和for...in 循环的那点事儿
大家都知道在JavaScript中提供了两种方式迭代对象: for 循环: for..in循环: 1.for循环 不足: 在于每次循环的时候数组的长度都要去获取: 终止条件要明确: 在for循环中,你 ...
- 你不知道的JavaScript--Item9 call(),apply(),bind()与回调
1.call(),apply(),bind()方法 JavaScript 中通过call或者apply用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定 ...
- ES5和ES6那些你必须知道的事儿(三)
ES5和ES6那些你必须知道的事儿 ES6新增的东西 一.块级作用域:关键字let,常量const let与var的区别: a.不会进行变量声明提升 b.变量不允许被重复定义 c.变量不允许被删除 d ...
- 转:SQL 关于apply的两种形式cross apply 和 outer apply
原文地址:http://www.cnblogs.com/Leo_wl/archive/2013/04/02/2997012.html SQL 关于apply的两种形式cross apply 和 out ...
- SQL 关于apply的两种形式cross apply 和 outer apply, with cube 、with rollup 和 grouping
1). apply有两种形式: cross apply 和 outer apply先看看语法: <left_table_expression> {cross|outer} apply &l ...
- JavaScript的Proxy可以做哪些有意思的事儿
摘要: 神奇而有趣的Proxy. 原文:拿Proxy可以做哪些有意思的事儿 作者:贾顺名 Fundebug经授权转载,版权归原作者所有. Proxy是什么 首先,我们要清楚,Proxy是什么意思,这个 ...
随机推荐
- php 引用其他action中的方法
例如要调用IndexAction里的isonline(); 可用下列代码 import('@.Action.IndexAction'); $Index=new IndexAction(); $Inde ...
- 《易货》Alpha版本项目展示
一.团队成员和个人博客地址 PM:董元财 开发人员:胡亚坤,董元财,刘猛 测试人员:益西多吉,马汉虎 团队名:bestRW 团队博客地址:http://www.cnblogs.com/niceRW/ ...
- c++ ,类型转换
一.隐式转换 1)精度低转高,sigend转unsigend2)数值0,会转为为指针. 数组名会转换为首地址.3)bool转换 .0为false.其他为true.-1也是true...4)非const ...
- Differences between volume, partition and drive
A drive is a physical block disk. For example: /dev/sda. A partition A drive can be divided into som ...
- Object Pascal 方法与技巧
4 方法与技巧 4.1 设置代码模板 代码模板是Delphi 的代码感知特性的一种,通过它可以快速.高效和正确地输入代码.代码模板将一些常用的语句块保存在模板中,然后程序员只要在代码编辑器中按下“Ct ...
- 转!!!Mysql无法创建外键的原因
在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1. 两个字段的类型或者大小不严格匹配.例如,如果一个 ...
- linux下tftp安装与设置
在学习linux+arm开发的时候,tftp和NFS是必不可少的环境.这里总结一下自己安装和使用tftp的一些经验,做个备忘. 一.tftp服务原理 tftp(trivial file transfe ...
- phalcon: 视图分层渲染,或包含其他页面
一:视图分层显现: 比如:在一个页面中,头部.底部固定不变,只有中间部分随操作变换显示.那么可以将中间部分切出来,剩余部分用作固定框架,放入:app/views/layouts目录中,起名为:base ...
- phalcon: 资源文件管 理 引入css,js
<?php class IndexController extends Phalcon\Mvc\Controller { public function index() { //添加本地css资 ...
- phalcon: 查找记录(Finding Records)可用的查询设置如下:
可用的查询设置如下: 参数 描述 举例 conditions Search conditions for the find operation. Is used to extract only tho ...