一、判定 this
按照优先顺序来总结一下从函数调用的调用点来判定 this 的规则。
函数是通过 new 被调用的吗(new 绑定)?如果是,this 就是新构建的对象。
var bar = new foo()
函数是通过 call 或 apply 被调用(明确绑定),甚至是隐藏在 bind硬绑定 之中吗?如果是,this 就是那个被明确指定的对象。
var bar = foo.call( obj2 )
函数是通过环境对象(也称为拥有者或容器对象)被调用的吗(隐含绑定)?如果是,this 就是那个环境对象。
var bar = obj1.foo()
否则,使用默认的 this(默认绑定)。如果在 strict mode 下,就是 undefined,否则是 global 对象。
var bar = foo()
以上,就是理解对于普通的函数调用来说的 this 绑定规则 所需的全部。