胡说call,apply,bind

2015-12-01

学过一点javascript的都知道call,apply,bind这三个货,能够改变函数的this指向,反正我也很糊涂搞三个干嘛,有什么区别呢?

call

首先看看MDN的解释:

call()方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法.

再看看语法:

fun.call(thisArg[, arg1[, arg2[, …]]])

能看出来call是function的方法,它第一个参数是要指向的对象,后面跟若干参数…

看看例子吧:

function a(){
  this.name = 'metro'
}
//普通执行函数
a()//这时this指向的全局变量假设在浏览器的话window.name为metro
var b = {}
a.call(b)//这时候this指向的就是b对象
console.log(b.name)//'metro'

Array.prototype.slice.call(arguments) 都看过这个吧…

要想知道这段代码的意义,首先array的slice是干嘛的,看代码吧


var a = [1, 2, 3, 4]
a.slice(0,1)//[1]
a.slice(2)//[3, 4]
var b = a.slice()
//b = [1, 2, 3, 4]

所以Array.prototype.slice这个东西可以返回一个数组,当然参数很重要,不传参数相当于复制一个数组,其他的很好理解,返回数组从start到end的位置元素.
Array.prototype.slice.call(arguments)
首先它是复制一个数组的代码形式,call呢,就是改变slice中的this指向,arguments不用解释了,所以这个就是把arguments返回成数组的形式。

apply

其实apply和call没啥区别,我感觉啥玩意,要说有区别那就是参数个数不一样,apply是两个,第一个也是改变this指向的对象,第二个是数组(其实没啥区别,看看代码)

function a(n, m) = {
  this.name = n
  this.age = m
}
var metroArr = ['metro', 22]
var metroObj = {}
a.apply(metroObj, metroArr)
a.call(metroObj, metroArr[0], metroArr[1])
//对比一下代码,真心没啥区别,
//那apply就这样了,和call差不多

bind

其实感觉bind和前面call也差不多。。但是得注意一点就是bind返回函数,bind传参数的形式和call一样的,一摸一样的,就不讲了吧

看看代码如何?

function a(){
  console.log(this.name)
}
var metro = {
  name: 'metro'
}
var b = a.bind(metro)
b()//打印metro
看着代码琢磨一下和call也没啥区别,但是三个函数重点是改变this指向,这个需要好好理解一下
Table of Contents