1.

  1. var name = 'window'; // let,cosnt声明的变量不保存在window属性中
  2. function Person(name) {
  3. this.name = name;
  4. this.obj = {
  5. name: "obj",
  6. fool: function() {
  7. return function() {
  8. console.log(this.name);
  9. }
  10. },
  11. foo2: function() {
  12. return () => {
  13. console.log(this.name);
  14. }
  15. }
  16. }
  17. }
  18. let person1 = new Person('person1');
  19. let person2 = new Person('person2');
  20. person1.obj.fool()(); // window
  21. person1.obj.fool.call(person2)() // window
  22. person1.obj.fool().call(person2); // person2
  23. person1.obj.foo2()(); // obj
  24. person1.obj.foo2.call(person2)(); // person2
  25. person1.obj.foo2().call(person2); // obj

2.

window.name = 'window';
function Person(name) {
    this.name = name;
    this.fool = function() {
        console.log(this.name);
    }
    this.foo2 = () => console.log(this, name);
    this.foo3 = function() {
        return function() {
            console.log(this.name);
        }
    };
    this.foo4 = function() {
        return () => {
            console.log(this.name);
        }
    }
}
let person1 = new Person('person1');
let person2 = new Person('person2');

person1.fool(); // person1
person1.fool.call(person2); // person2

person1.foo2(); // 箭头函数向上级查找为person1
person1.foo2.call(person2); // 同理person1

person1.foo3()(); // window
person1.foo3.call(person2)(); // window
person1.foo3().call(person2); // person2

person1.foo4()(); // person1
person1.foo4.call(person2)(); // person2
person1.foo4().call(person2); // person1

3.

var name = "window"; // let 声明变量不包含在window属性中
let person1 = {
    name: "person1",
    foo1: function() {
        console.log(this.name);
    },
    foo2: () => console.log(this.name),
    foo3: function() {
        return function() {
            console.log(this.name);
        }
    },
    foo4: function() {
        return () => {
            console.log(this.name);
        }
    }
}
let person2 = { name: 'person2' }
person1.foo1(); // person1
person1.foo1.call(person2); // person2 显示绑定大于隐式绑定

person1.foo2(); // window 箭头函数this指向在上下文中查找
// obj定义对象的大括号并不是规定了一个作用域

person1.foo2.call(person2); // window

person1.foo3()(); // window 独立函数调用
person1.foo3.call(person2)(); // window
person1.foo3().call(person2); // person2

person1.foo4()(); // person1 向上级作用域种查找,this指向person1
person1.foo4.call(person2)(); // person2