call()、apply()、bind()的共同点:
都可以改变this指向
call的使用
var str = 'window';
var obj = { str: 'obj内的str' };
function fun() {
console.log(this, this.str);
}
fun.call(obj); //call立即执行
fun();
apply的使用
var str = 'window';
var obj = { str: 'obj内的str' };
function fun() {
console.log(this, this.str);
}
fun.apply(obj); //apply立即执行
fun();
bind的使用
var str = 'window';
var obj = { str: 'obj内的str' };
function fun() {
console.log(this, this.str);
}
fun.bind(obj)(); //bind不会立即执行因为bind返回的是函数
fun();
call()、apply()、bind()的区别:
- call、apply可以立即执行,bind不会立即执行,因为bind返回的是一个函数,需要加()才可以执行
- 参数不同:apply第二个参数是数组,call和bind有多个参数需要挨个写
使用场景
apply
var arr1 = [1, 2, 3, 5, 61, 65];
console.log(Math.max.apply(null, arr1));
这里直接将数组arr1放进去得到的结果是NaN,可以使用es6新增的扩展运算符,也可以使用apply,因为apply后面的参数是数组形式,由于这里不牵扯this指向问题,所以第一个参数是null
bind
<button id="btn">1111</button>
<h1 id="h1s">2222</h1>
var btn = document.getElementById('btn');
var h1s = document.getElementById('h1s');
btn.onclick = function () {
console.log(this.id);
}.bind(h1s);
这里的this点击之后本来是指向btn的,我们通过bind改变其指向h1s,并且在这里不用加括号;
如果在这里使用call和apply会有问题,不点击就会输出this