概述
bind call apply都是改变this指向的
bind
bind不会立即调用,而是返回一个新函数,称为绑定函数,其内的this指向为创建它时传入bind的第一个参数,而传入bind的第二个及以后的参数作为原函数的参数来调用原函数。
var a = {name:'test'}
function test(){
console.log('test',this);
}
function test1(){
console.log('test',this,arguments);
}
test.bind(a,{user:'testUser'})();
test1.bind(a,{user:'testUser'})();
// test { name: 'test' }
// test1 { name: 'test' } [Arguments] { '0': { user: 'testUser' } }
call
立即调用,其内的this指向它传入call的第一个参数,而传入bind的第二个及其以后的参数都是数组里面的元素。
var b = {name:'test'}
function test(){
console.log('test',this)
}
function test1(){
console.log('test1',this,arguments)
}
test.call(b);
test1.call(b,{user:'testUser'});
// test { name: 'test' }
// test1 { name: 'test' } [Arguments] { '0': { user: 'testUser' } }
apply
立即调用,其内的this指向它传入apply的第一个参数,而传入apply的第二个参数是参数数组。
var c = {name:'test'}
function test(){
console.log('test',this)
}
function test1(){
console.log('test1',this,arguments)
}
test.apply(c);
test1.apply(c,[{user:'testUser'}]);
// test { name: 'test' }
// test1 { name: 'test' } [Arguments] { '0': { user: 'testUser' } }