5,this

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。