1.前言
this的指向和在哪里定义无关,跟如何调用有关
2.绑定原则
1.默认绑定
function f() {
console.log(this)
}
f()
2.隐式绑定
const p1 = {
name: "a",
getName() {
console.log(this.name)
console.log(this)
},
}
p1.getName()
const p1 = {
age: "a",
getName() {
console.log(this.age)
console.log(this)
},
}
const f = p1.getName
f()
var age = 18
const p1 = {
age: 38,
getAge() {
console.log(this.age)
console.log(this)
},
}
function fn(func) {
func()
}
fn(p1.getAge)
3.显式绑定
var name = "a"
const p1 = {
name: "b",
getName(sex) {
console.log(this.name)
console.log(sex)
console.log(this)
},
}
function init(fn) {
fn.call(p1, "man")
}
init(p1.getName)
var name = "a"
const p1 = {
name: "b",
getName(sex) {
console.log(this.name)
console.log(sex)
console.log(this)
},
}
function init(fn) {
fn.apply(p1, ["man"])
}
init(p1.getName)
var name = "a"
const p1 = {
name: "b",
getName(sex) {
console.log(this.name)
console.log(sex)
console.log(this)
},
}
function init(fn) {
const newFn = fn.bind(p1)
newFn("man")
}
init(p1.getName)
4,new关键字
function Person(nm) {
this.nm = nm
}
const p1 = new Person("a")
console.log(p1)
3.绑定优先级
function getNm() {
console.log(this.nm)
}
const p1 = {
nm: "a",
getNm,
}
p1.getNm()
var nm = "b"
const p1 = {
nm: "a",
getNm() {
console.log(nm)
},
}
p1.getNm.call(this)
p1.getNm.apply(this)
p1.getNm.bind(this)()
var nm = "b"
const p1 = {
nm: "a",
getNm() {
console.log(nm)
},
}
const newFn = p1.getNm.bind(this)
newFn.call(p1)
newFn.apply(p1)
const p = {
age: 1,
}
function Person(nm, age) {
this.nm = nm
this.age = age
}
const newFn = Person.bind(p)
const p2 = new newFn("p2", 5)
console.log(p2)
4.箭头函数
var nm = "window"
const p1 = {
nm: "p1",
getName: () => {
console.log(this.nm)
},
}
p1.getName()
const p2 = {
nm: "p2",
getName() {
return {
nm: "p3",
getName2: () => {
console.log(this)
console.log(this.nm)
},
}
},
}
const res = p2.getName()
res.getName2()
5,总结