综合this绑定 和 创建对象的JS笔试题

132 阅读1分钟
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这里代表了新对象的内部属性。这么一说整道题的思路就清楚了。