文章目录
- 都是用来改变函数的 this 对象的指向的。
- 第一个参数都是 this 要指向的对象。
- 参数、绑定规则(显示绑定和强绑定),运行效率(最终都会转换成一个一个的参数去运行)、运行情况(call , apply 立即执行,bind 是 return 出一个 this “ 固定 ” 的函数,这也是为什么 bind 是强绑定的一个原因)。
- 在
javascipt
中,call
和apply
都是为了改变某个函数运行时的上下文而存在的,换句话说就是为了改变函数体内部this
的指向。
call()
1 | function class1() { |
1 | function eat(x, y) { |
这个例子中的意思就是用 eat 来替换 drink,eat.call(drink,3,2) == eat(3,2)
1 | function Animal() { |
意思是把 animal 的方法放到 dog 上执行,也可以说,把 animal 的 showName() 方法放到 dog 上来执行,所以 this.name 应该是 dog。
1 | function fruits() {} |
所以可以看出call
和apply
是为了动态改变 this 二存在的,当一个 object 没有某个方法。但是其他的有。我们可以借助 call 或 apply 用其他对象的方法来操作。
1 | func.call(this, arg1, arg2) |
查找数组中的最大值
1 | var numbers = [5, 458, 120, -215] |
继承
1 | function Animal(name) { |
Animal.call(this) 的意思就是使用 Animal 对象代替 this 对象,那么 Dog 就能直接调用 Animal 的所有属性和方法。
1 | var toString = Object.prototype.toString |
apply
1 | function class1(args1, args2) { |
bind
bind 是在 EcmaScript5 中扩展的方法(IE6,7,8 不支持。)
bind() 方法会创建一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以创建它时传入 bind() 方法的第一个参数作为 this,传入 bind() 方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数。
1 | var bar = function () { |