深入浅出 妙用Javascript中apply、call、bind
2016-12-10 16:23
204 查看
apply、call
在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。
先来一个栗子:
apply、call 的区别
对于 apply、call 二者而言,作用完全一样,只是接受参数的方式不太一样。例如,有一个函数定义如下:JavaScript 中,某个函数的参数数量是不固定的,因此要说适用条件的话,当你的参数是明确知道数量时用 call 。
而不确定的时候用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个数组来遍历所有的参数。
为了巩固加深记忆,下面列举一些常用用法:
1、数组之间追加
3、验证是否是数组(前提是toString()方法没有被重写过)
但是我们能通过 Array.prototype.slice.call 转换为真正的数组的带有 length 属性的对象,这样 domNodes 就可以应用 Array 下的所有方法了。
深入理解运用apply、call
下面就借用一道面试题,来更深入的去理解下 apply 和 call 。定义一个 log 方法,让它可以代理 console.log 方法,常见的解决方法是:
bind
说完了 apply 和 call ,再来说说bind。bind() 方法与 apply 和 call 很相似,也是可以改变函数体内 this 的指向。MDN的解释是:bind()方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind()方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
直接来看看具体如何使用,在常见的单体模式中,通常我们会使用 _this , that , self 等保存 this ,这样我们可以在改变了上下文之后继续引用到它。 像这样:
有个有趣的问题,如果连续 bind() 两次,亦或者是连续 bind() 三次那么输出的值是什么呢?像这样:
apply、call、bind比较
那么 apply、call、bind 三者相比较,之间又有什么异同呢?何时使用 apply、call,何时使用 bind 呢。简单的一个栗子:也就是说,区别是,当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用 bind() 方法。而 apply/call 则会立即执行函数。
再总结一下:
apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
apply 、 call 、bind 三者都可以利用后续参数传参;
bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用 。
相关文章推荐
- 深入浅出 妙用Javascript中apply、call、bind
- 【优雅代码】深入浅出 妙用Javascript中apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- [转]深入浅出妙用 Javascript 中 apply、call、bind
- 深入浅出妙用 Javascript 中 apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- 【优雅代码】深入浅出 妙用Javascript中apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- 【优雅代码】深入浅出 妙用Javascript中apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- [转]深入浅出妙用 Javascript 中 apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- 深入浅出 妙用Javascript中apply、call、bind
- 深入浅出妙用 Javascript 中 apply、call、bind
- 深入浅出Javascript中apply、call和bind以及它们的妙用