call和apply的用途是完全一样的。改变函数中this的指向:

为什么要改变this的指向呢?这个有什么用?有哪些场景呢?

首先this的指向总是在变的,this的指向是由函数执行时所在的环境决定的,而不是函数声明时的环境。

this都指向哪里?

1、在控制台中输入下面的代码,此时可以看到this指向a这个对象。

var a={
name:'a',
getName:function(){
return this.name;
}
}
console.info(a.getName());//a

2、此时this指向了window

window.name= 'window';
var a={
name:'a',
getName:function(){
return this.name;
}
} var b = a.getName;
console.info(b());//window

结论:

如果函数是作为一个对象的属性被调用的(用点的方式调用),此时函数内的this就指向这个对象。

如果是用变量或者名称的方式直接调用的(不是使用点调用),则指向window。

场景:

this的改变:在写代码时经常会遇到这种情况,将函数作为回调函数使用时,this的指向变为了window,这个不是我们预期的结果

window.name='window';
var a={
name:'a',
getName:function(callback){
return callback();//funcB使用非对象.的方式调用
},
funcB:function(){
return this.name;
}
}
console.info(a.getName(a.funcB));//window

这个时候就可以用call或者apply把this传递到callback中,callback中的this的指向就会被传入的this所替代。

当然,也可以传入其他对象覆盖当前this的指向。

window.name='window';
var b={
name:'b'
};
var a={
name:'a',
getName:function(callback){
return callback.call(b);//传入b
},
funcB:function(){
return this.name;
}
}
console.info(a.getName(a.funcB));//b

也可以借用这个对象的方法。

window.name='window';
var b={
name:'b',
getBName:function(){
return this.name;
}
};
var a={
name:'a',
getName:function(callback){
return callback.call(b);//传入b
},
funcB:function(){
return this.getBName();
}
}
console.info(a.getName(a.funcB));//b

使用这个功能可以实现类似继承的效果

var  F=function(name){
this.name = name;
}
var S = function(){
this.age=arguments[];
F.apply(this,arguments);
}
S.prototype.getNameAndAge=function(){
console.info('名字是'+this.name+'年龄是'+this.age);
} var s = new S('小红','9岁');
s.getNameAndAge();//名字是小红年龄是9岁

call和apply的区别:

传入的参数形式不一样

call(obj,参数1,参数2);

apply(obj,[参数1,参数2]);

js中call和apply的作用和用法的更多相关文章

  1. js中call、apply、bind的用法

    原文链接:http://www.cnblogs.com/xljzlw/p/3775162.html var zlw = { name: "zlw", sayHello: funct ...

  2. JS中call()、apply()、bind()的用法

    其实是一个很简单的东西,认真看十分钟就从一脸懵B 到完全 理解! 先看明白下面: 例1 obj.objAge;  //17 obj.myFun()  //小张年龄undefined 例2 shows( ...

  3. asp.net类似于js中的setTimeOut()的函数作用?

    asp.net类似于js中的setTimeOut()的函数作用? 插入这行即可,定时2秒,再运行下一步: System.Threading.Thread.Sleep(); 加个随机数 Random r ...

  4. js中call和apply的实现原理

    js中call和apply的实现原理            实现call的思路: /* 还有就是call方法是放在Function().prototype上的也就是构造函数才有的call方法 (我门可 ...

  5. js中哈希表的几种用法总结

    本篇文章只要是对js中哈希表的几种用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 1. <html> <head> <script type=" ...

  6. JS中 call() 与apply 方法

    1.方法定义 call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明: call ...

  7. JS中call和apply

    作用: 替换当前对象的方法中的this. 理解: call和apply是为了动态改变this出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其它对象的方法来操作 ...

  8. js中call、apply、bind那些事

    前言 回想起之前的一些面试,几乎每次都会问到一个js中关于call.apply.bind的问题,比如- 怎么利用call.apply来求一个数组中最大或者最小值 如何利用call.apply来做继承 ...

  9. js中的call,apply,bind区别

    在JavaScript中,call.apply和bind是Function对象自带的三个方法,这三个方法的主要作用是改变函数中的this指向. call.apply.bind方法的共同点和区别:app ...

随机推荐

  1. 发布WebApi项目时,提示未包含bin\yourDocumentationFile.xml文档文件

    Open your publishprofile (*.pubxml) and include this code into "Project" element: <Item ...

  2. 一脸懵逼学习MapReduce的原理和编程(Map局部处理,Reduce汇总)和MapReduce几种运行方式

    1:MapReduce的概述: (1):MapReduce是一种分布式计算模型,由Google提出,主要用于搜索领域,解决海量数据的计算问题. (2):MapReduce由两个阶段组成:Map和Red ...

  3. 运维基础——Zabbix 设置Redis监控

    https://blog.csdn.net/xundh/article/details/77604357

  4. 【ASP.NET】UCenter实现多站点同步登录退出

    利用UCenter实现discuz论坛和应用网站同步登录和退出功能 测试环境:Discuz! X3.2.UCenter 1.6..Net Framework 4.0 进入Discuz 后台的UCent ...

  5. Python replace() 和 re.sub() 字符串字符替换

    Python replace() 和 re.sub() 字符串字符替换 replace() testStr = 'aa:bb[cc' testStr.replace(':','_') 每次只能替换一个 ...

  6. laravel启动过程简单解析

    :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);border-radius:3px ...

  7. Enrolment注册插件

    自moodle2.0注册插件必须继承 lib/enrollib.php的  enrol_plugin 抽象类:这个基类包含所有标准方法和开发人员文档 课程注册信息存储在enrol和user_enrol ...

  8. group by 和where 条件后面不能用刚设置的别名。

    select count(*),c_xy_bj a from z_user group by c_xy_bj     这个group by后面不能使用c_xy_bj 字段的别名a,只有外面再嵌套sel ...

  9. [ 高危 ] my网任意账户登陆

    该网站的任意登录其实都已经提交得差不多了,本来以为这个漏洞会是一个重复的,然而试了一下发现思路奇葩. 任意登录,一般都为验证码爆破,4位手机验证码,而用于拦截的图片验证码没有或者可以重复使用,所以就能 ...

  10. 深度学习中的batch_size,iterations,epochs等概念的理解

    在自己完成的几个有关深度学习的Demo中,几乎都出现了batch_size,iterations,epochs这些字眼,刚开始我也没在意,觉得Demo能运行就OK了,但随着学习的深入,我就觉得不弄懂这 ...