代码如下
const obj = {
id : "obj",
getId : function () {
console.log(this.id);
},
getId2 : () => {
console.log(this.id);
}
};
const obj2 = {
sub : {
map: new Map(),
getId : () => {
console.log(this.id)
}
},
id : "obj2",
};
obj2.sub.map.set("getId", () => {console.log(this.id)});
const obj3 = {
obj : obj2.sub.map.get("getId"),
id : "obj3"
};
var id = "window"; //只有var声明的变量才会同时创建为window的属性
obj.getId(); //obj
obj.getId2(); //window
obj2.sub.map.get("getId")(); //window
obj2.sub.getId(); //window
obj3.obj(); //window
根据以上代码,是否可以理解为对象中以属性方式定义的箭头函数,运行时总是指向window?
在代码中obj2里的嵌套对象中,
如果用普通函数的话能是指向sub本身的作用域,
但用箭头函数时,如果按箭头函数体内的this对象是定义时所在的对象而不是使用时所在的对象这个思路应该是指向sub对象的上一级obj2的作用域,但最后却指向了window
主要是这部分有点不明白
---------------------------------以下是暂时想到的答案,如有错漏欢迎指出---------------------------------
因为我看阮一峰老师的es6标准入门时,上面说的解释是:
因为这样,一直想不明白为什么会出现运行上面代码时的结果
刚刚翻了下John Resig的JavaScript忍者秘籍(第2版),解释是:
另外翻了Nicholas C.Zakes的深入理解es6,里面的解释是:
因为如果用普通函数的话,每一层嵌套对象各自都有作用域(如图)
但综合几本书和评论里观点,那么就是说无论对象嵌套有多深,因为作为对象的方法箭头函数不是被普通函数包含,那么this可以理解为总是指向window对象(如图)
至于浏览器跟node输出不一致,是因为node环境下和浏览器的全局对象不同而造成,不在讨论范围
果然将箭头函数作为对象方法会引起混乱啊