87.函数上下文作用域
题目描述
let obj = {
name: "name",
fn: function () {
console.log(this.name);
},
newFn: () => console.log(this.name),
sub: {
name: "sub",
fn: function () {
console.log(this.name);
},
newFn: () => console.log(this.name),
},
};
let fn = obj.fn;
let newFn = obj.newFn;
let subFn = obj.sub.fn;
let subNewFn = obj.sub.newFn;
fn();
obj.fn();
newFn();
obj.newFn();
subFn();
obj.sub.fn(); // sub
subNewFn();
obj.sub.newFn();
错误回答
undefined;
name;
undefined;
undefined;
sub;
name;
undefined;
undefined;
参考答案
DETAILS
subFn 是从 obj.sub.fn 赋值过来的。虽然它原本是 obj.sub 对象的方法,但在赋值之后,subFn 成为了一个独立的函数。当调用 subFn() 时,它不再与 obj.sub 对象关联。因此,this 的值取决于调用方式。
这里是通过 obj.sub 对象直接调用 fn 方法。在这种情况下,fn 是作为 obj.sub 对象的方法被调用的。根据 JavaScript 的规则,当通过对象调用方法时,this 指向该对象。因此,this 在这里指向 obj.sub。
undefined;
name;
undefined;
undefined;
undefined;
sub;
undefined;
undefined;