1,隐式绑定,注意特定情况,丢失对象的问题。
只要记住:1,最终调的是谁fn 2,这个fn在哪里
obj.foo() 打印this.a a在obj,或者window也有一个
2,显示 apply call bind硬绑定,使用指定的this
myArray.forEach( foo, obj ); 依次传参arr的元素,然后分别都绑定obj
3,new绑定
手写一个new
var obj = new Object();
Con = [].shift.call(arguments); 取出第一个参数,即: 构造函数
obj.__proto__ = Con.prototype; 使obj的原型能访问构造函数原型中的属性
var ret = Con.apply(obj, arguments); 使obj的能访问构造函数中的属性
return ret instanceof Object ? ret : obj;
优先级
new > 显 > 隐 > 默认
currying提前设置一些参数
Object.create(null) 没有委托
{} 有委托propetype
var name = 'window'
var person1 = {
name: 'person1',
show1: function () {
console.log(this.name)
},
show2: () => console.log(this.name),
show3: function () {
return function () {
console.log(this.name)
}
},
show4: function () {
return () => console.log(this.name)
}
}
var person2 = { name: 'person2' }
//var personA = new Person('personA')
//var personB = new Person('personB')
//personA.show1()
person1.show1() // 隐式绑定 person1
person1.show1.call(person2) // 显示绑定 person2
person1.show2() // window 箭头绑定,指向外层作用域
person1.show2.call(person2) // window 箭 指 外层
person1.show3()() // 外层调用window,类似fn=person1.show3() fn()
person1.show3().call(person2)// fn=person1.show3() fn.call(person2)
person1.show3.call(person2)() // window默认绑定fn(return fn).call(person2
person1.show4()() // 箭指外层域,person1
person1.show4().call(person2) // 箭指外层作用域,person1
person1.show4.call(person2)()// fn=...call(person2), fn()外层是person2
网友评论