var name = 'global';
var obj = {
name: 'local',
foo: function(){
this.name = 'foo';
}.bind(window)
};
var bar = new obj.foo();
setTimeout(function() {
console.log(window.name);
}, 0);
console.log(bar.name);
var bar3 = bar2 = bar;
bar2.name = 'foo2';
console.log(bar3.name);
本题的重点是obj对象里面的foo函数,bind(window)说明这个函数内部的this指向window,但是实际使用的时候真的如此吗?
接下来使用new创建对象十分具有迷惑性,先回顾一下使用new创建对象的过程:
- 创建一个新对象
- 对这个新对象进行原型链接
- 这个新对象会被绑定到函数调用的this
- 若这个构造函数不返回其他对象,则返回这个新对象
当创建一个新对象的时候,构造函数内部的this指向的就是这个新函数而非函数本身绑定指向的this,因此this这里代表了新对象的内部属性。这么一说整道题的思路就清楚了。