call apply bind

495 阅读1分钟

call apply bind

call和apply都可以用来改变函数里的this指向,区别是 call(obj,1,2,3,)从第二个参数开始有多个参数,用来代表函数的实参apply(obj,[1,2,3])第二个参数是一个数组,数组中的每一个元素对应一个实参bind(obj,1,2,3,)(); apply,call是直接执行函数调用,bind是绑定,执行需要再次调用.apply和call 的区别是apply接受数组作为参数,而call是接受逗号分隔的无限多个参数列表,

分析:   首先,从总体结构而言,bind()是一个函数,故采用function定义。由于foo.bind()得到的仍然是一个函数,因而返回值是一个函数。   第二,在返回的函数中,需要执行一次改变了执行环境的原函数,使用apply(obj)达到将原函数的执行环境改为obj的目的。   第三,对于bind()函数而言,由于它是Function.prototype的一个属性,它的this将指向调用它的对象。例如,foo.bind(obj),则bind()函数内部的this指向foo()函数。但对于执行bind()后得到的新函数,它的this将指向全局对象,因此需要使用var _self = this这样的参数传递。   第四,调用bind()得到的新函数需要接收执行bind()时传入的实际参数。因此,使用了args = arguments这样的赋值。需要将执行bind()时传入的参数进行分离,只获取第一个参数后面的参数,slice()方法可以达到这个目的。又由于arguments是类数组对象不是真正的数组,故而没有slice方法,使用call()以达到借用的目的。