在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。
JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。
call() apply()
对于 apply、call 二者而言,作用完全一样,只是接受参数的方式不太一样 (apply的第二个参数是数组,call第二个参数查看如下第二个例子)。
// apply function test () { console.log(this.name) } var obj1 = { name: '测试1' } var obj2 = { name: '测试2' } test.apply(obj1) // 输入测试1 test.apply(obj1) // 输入测试2
// call var arr = [1,2,3]; Array.prototype.push.call(arr,6,7,8); //参数是一个一个传的 console.log(arr); //[1, 2, 3, 6, 7, 8]
bind()
bind方法和apply、call的作用也是差不多的,不同的是 apply、call 这两个方法是立即执行函数。
// bind let obj1 = { name:'测试1' } let obj2 = { name:'测试2' } function test(){ console.log(this.name); } let play = test.bind(one); //这里并不会立即执行 play(); //所以 可以将这个方法 放到需要的地方 在执行