每个函数都包含两个非继承而来的方法,apply()和call(),这两方法的用途都是在特定的作用域中调用函数,实际上等于设置函数数体内的this对象的值。
apply()和call()第一个参数都一样,运行函数的作用域
apply()第二个参数是数组,call()其余参数直接传给函数。
function() sum(num1, num2){
return num1 + num2;
}
function() callSum1(num1, num2){
return sum.apply(this, arguments); //传入arguments对象
}
function callSum2(num1, num2){
retrun sum.apply(this, [num1, num2]);
} alert(callSum1(10,10)); //
alert(callSum2(10,10)); //

在上面例子中,callSum1在执行sum()函数传入了this值(因为是在全局作用域中调用的,所以传入的就是window对象)和arguments对象。callSum2同样也调用了sum()函数,但传入的是this 和一个参数数组。

call()方法和apply()方法的作用相同,它们的区别仅在于接收参数的的方式不同,对于call()方法而言,第一个参数是this值没有变化,变化的是其余参数都是直接传递给函数,在使用call()方法时,传递给函数的参数必须逐个列举出来。 如下列子所示。

function sum(num1, num2){
return sum1 + num2;
} function callSum(num1, num2){
return sum.call(this, num1, num2);
} alert(callSum(10, 10)) //

传递参数并非apply()和call()真正的用武之地,它们真正强大的地方是能够扩充函数赖以运行的作用域。

window.color = 'red';
var o = { color: 'bule' };
function sayColor() {
alert(this.color);
} sayColor(); //red
sayColor.call(this); //red
sayColor.call(window); //red
sayColot.call(o); //bule

这个例子是在前面说明this对象的示例基础上修改而成的,这一次,sayColor()也是作为全局函数定义的,而且在全局作用域中调用它时,它的确会显示'red'——因为对this.color的求值会转换成window.color的求值。而sayColor.call(this)和sayColor.call(window),则是两种显示地在全局作用域中调用灌输的方式,结果当然都会显示“red”.但是当运行sayColor.call(o)时,函数执行环境就不一样, 因为此时函数体内的this对象指向了o,于是结果显示的是‘blue’。

使用call()和apply()来扩充作用域的最大好处,就是对象不需要与方法耦合关系。

es5还定义了一个方法,bind()。这个方法会创建一函数实例,其this值会被绑定到bind()函数的值。

window.color = 'red';
var o = { color: 'blue' } ;
functuon sayColor(){
alert(this.color);
} var objSayColor = sayColor.bind(o);
objSayColor(); //blue

sayColor()调用bind()并传入对象哦,创建了objSayColor()函数。 objSayColor()函数的this值等于哦,因此即使在全局作用域中调用这个函数,也会看到‘blue’

一个简单bind()函数接受一个函数和一个环境,并返回一个在给定环境中调用给定的函数,并且将所有参数原封不动传递过去。语法如下

function bind(fn, context){
return function(){
return fn.apply(context, arguments);
}
}

这个函数似乎很简单,但其功能是非常的强大,在bind()中创建了一个闭包,闭包使用apple()调用传入的函数,并给apply()传递context对象和参数。注意这里使用的arguments对象是内部函数的,而非bind()的。当调用返回函数时,它会在给定环境中执行被传入的函数并给出所有参数。

call(),apply(),bind()区别?的更多相关文章

  1. call apply bind 区别?

    call apply bind 区别? 例:定义一个计算器,没绑定bind的为公共计算器,call可以调用,绑定bind的为私人计算器,别人调用不了, //ps:用bind绑定的call强制作借用不好 ...

  2. call, apply, bind 区别

    #call, apply, bind 区别及模拟实现call apply bind 三者都可以用来改变this的指向,但是在用法上略有不同  首先说一下call和apply的区别 call和apply ...

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

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

  4. call(),apply(),bind() 区别和用法

    call call 方法第一个参数是要绑定给this的值,后面传入的是一个参数列表.当第一个参数为null.undefined的时候,默认指向window. var arr = [1, 2, 3, 8 ...

  5. js 中arguments,call,apply,bind的使用

    //对于 arguments和this, 每个函数都有自己独有的arguments和this, 且不进行链式查找 //arguments是什么? //答:1:arguments是收到的实参副本 //2 ...

  6. bind,apply,call区别总结

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. JavaScript中call,apply,bind方法的区别

    call,apply,bind方法一般用来指定this的环境. var a = { user:"hahaha", fn:function(){ console.log(this.u ...

  8. javascript中的call(),apply(),bind()方法的区别

    之前一直迷惑,记不住call(),apply(),bind()的区别.不知道如何使用,一直处于懵懂的状态.直到有一天面试被问到了这三个方法的区别,所以觉得很有必要总结一下. 如果有不全面的地方,后续再 ...

  9. apply、call、bind区别、用法

    apply和call都是为了改变某个函数运行时的上下文而存在的(就是为了改变函数内部this的指向):   如果使用apply或call方法,那么this指向他们的第一个参数,apply的第二个参数是 ...

  10. bind、call、apply的区别与实现原理

    1.简单说一下bind.call.apply的区别 三者都是用于改变函数体内this的指向,但是bind与apply和call的最大的区别是:bind不会立即调用,而是返回一个新函数,称为绑定函数,其 ...

随机推荐

  1. SQL—访问操作(2)

    上一篇介绍了数据访问操作的两种方法,接下来把剩下两个操作简单介绍一下: ExecuteNonQuery()的操作:对数据库进行增加.修改.删除 返回类型是 int  代表受影响的行数 返回的结果如果是 ...

  2. element表格添加查看操作

    表格代码:黄色部分关键代码 首先看效果: <el-table :data="tableData" border height="480" style=&q ...

  3. SpringAOP术语

    2019-03-10/21:12:31 参考博客:MiroKlose AOP术语 1.通知: 通知定义了切面要完成的工作内容和何时完成工作,就是什么时候去做辅助功能,功能具体是什么代码 五种类型 Be ...

  4. cesium 之三维漫游飞行效果实现篇(附源码下载)

    前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 内 ...

  5. Dynamics 365-关于Solution的那些事(二)

    接着上一篇的说,现在有一个已知前提:Solution的增量特性.然后我们再思考这么一个场景,项目开发过程中,存在多次迭代的情况,每次迭代可能涉及到的solution是同一个,唯一区别的,就是solut ...

  6. Parcelable 小记

    Parcelable 类,接口类,用于数据的序列化封装.常见的Bundle,Intent类都实现了该类.   实现该类需要实现writeToParcel和describeContents方法,最后还需 ...

  7. ORA-279 signalled during: alter database recover logfile

    在RMAN的RECOVER还原过程中,RMAN界面正常,但是检查.刷新告警日志,发现告警日志里面有ORA-279,如下所示: alter database recover logfile '/u06/ ...

  8. ASP.NET基础知识汇总之WebConfig自定义节点详细介绍

    之前介绍过Webconfig的具体知识ASP.NET基础知识汇总之WebConfig各节点介绍.今天准备封装一个ConfigHelper类,涉及到了自定义节点的东东,平时虽然一直用,但也没有系统的总结 ...

  9. 最新webstorm

    https://blog.csdn.net/hdp134793/article/details/81530472 最新webstorm,立即装,还有小盒子要弄个备份的,还有公交卡 2019-3-17( ...

  10. 【css】一行或者多行文字垂直水平居中

    1.方法一:使用css3弹性盒子(兼容IE10及以上浏览器,firefox,chrome,safari 5.1.7不支持) <!DOCTYPE html> <html> < ...