call:指定this的指向,也就是地址的指向。返回值是执行后的结果。
一、空、undefined、null中this全部指向的window;其他情况则指向它本身,不是对象的转换为对象。而且call绑定时是立即执行函数的。
let obj = {
eat(){
console.log("吃八方财")
console.log(this);
}
}
obj.eat.call() // window
obj.eat.call(undefined) // window
obj.eat.call(null) // window
指向它本身,不是对象的转换为对象。
function fn(){
console.log(this);
}
let obj = {}
// fn.apply() //win
// fn.apply(null) //win
// fn.apply(undefined) //win
//指向它本身,不是对象的转换为对象。
// fn.apply('222') //String{'222'}
// fn.apply([]) //[ ]
// fn.apply({}) //{ }
// fn.apply(NaN) //Number{NaN}
// fn.apply(111) //Number{111}
// fn.apply(function(name,age){}) // ƒ (name,age){}
fn.apply(Object) // ƒ Object() { [native code] }
二、call中的this总是指向调用函数的对象。
例如:
let obj = {
eat(){
console.log("吃八方财")
}
}
function fn(){
console.log(this); //window
obj.eat.call(this) // window
}
fn() // window.fn()
未创建实例,则this指向window
let obj = {
eat(){
console.log("吃八方财")
}
}
function fn(){
console.log(this); // ff
obj.eat.call(this) // ff
}
let ff = new fn()
ff.fn()
创建实例,则this指向实例对象。
apply与call用法相同,唯一的不同是参数书写方式不同;apply的参数是数组形式,而call的参数形式是一个一个的。
obj.eat.call(undefined, 1, 'name', 3)
obj.eat.apply(undefined, [ 1, 'name', 3 ])
三、bind绑定的函数不立即执行,需要加括号才执行。this和参数的形式与call一样,参数是一个一个的。
let obj = {
eat(){
console.log("吃八方财")
}
}
function fn(name,age){
console.log(name , age);
}
fn.bind(obj, 'xiaohong', 18)
不加括号其实返回的是绑定的函数。
如果加上括号就会立即执行:
fn.bind(obj, 'xiaohong', 18)()