1.
var name = 'window'; // let,cosnt声明的变量不保存在window属性中
function Person(name) {
this.name = name;
this.obj = {
name: "obj",
fool: function() {
return function() {
console.log(this.name);
}
},
foo2: function() {
return () => {
console.log(this.name);
}
}
}
}
let person1 = new Person('person1');
let person2 = new Person('person2');
person1.obj.fool()(); // window
person1.obj.fool.call(person2)() // window
person1.obj.fool().call(person2); // person2
person1.obj.foo2()(); // obj
person1.obj.foo2.call(person2)(); // person2
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