inner = 'window'
function say() {
console.log(inner)
console.log(this.inner)
}
var obj1 = (function () {
var inner = '1-1';
return {
inner:'1-2',
say:function () {
console.log(inner)
console.log(this.inner)
}
}
})();
var obj2 = (function () {
var inner = '2-1';
return {
inner:'2-2',
say:function () {
console.log(inner)
console.log(this.inner)
}
}
})();
say(); //'window' 'window'
obj1.say(); // '1-1' '1-2'
obj2.say(); // '2-1' '2-2'
obj1.say = say;
obj1.say(); // 'window' '1-2'
obj1.say = obj2.say;
obj1.say(); // '2-1' '1-2'
- 直接调用say()执行,this指向window, 输出为window, window
- obj1.say(), this指向obj1对象,obj对象中分别有一个属性inner和方法say()。调用obj1.say()输出的inner,根据作用域链向上寻找为1-1,而this.inner指的是obj1对象的inner,输出为1-2
- 同理可知obj2.say()的输出
- 将say方法赋给obj1.say(),执行时inner对应了window, 而this.inner中的this指向了对象obj1,所以该值表示的是对象obj1中的属性inner的值1-2
- 将对象obj2的say方法赋给obj1,执行时inner对应2-1,而this.inner中thi指向对象obj1,所以该值表示的是对象obj1中的属性inner的值1-2
自己的学习理解,可能解释有误