刚才我开始使用lapply(mylist, myfun)
关键字,我一直在想,为什么“这个”不起作用?
this
看看第三个var obj = {
thas: this,
obj2: {
obj3: {
thos: this,
lol: "lol",
pap: function() {
console.log(obj.obj2.obj3.lol);
console.log(this.lol);
console.log(thos.lol);
}
}
}
};
obj.obj2.obj3.pap();
。
我正在定义变量,为什么我这个错误:console.log()
答案 0 :(得分:4)
我认为thos
需要以与lol
相同的方式引用。您使用this.lol
来访问lol
,因此要访问thos
,您必须访问this.thos
,这可能不会用作this.thos.lol
。 OOP有时会变得怪异。如果您想使用thos
,请在对象外部进行定义并尝试...
编辑:这是修改后的代码:
// this is the new line:
var thos = this;
var obj = {
thas: this,
obj2: {
obj3: {
lol: "lol",
pap: function() {
console.log(obj.obj2.obj3.lol);
console.log(this.lol);
console.log(thos.lol);
}
}
}
};
obj.obj2.obj3.pap();
希望这有帮助!
答案 1 :(得分:3)
函数的
this
关键字在JavaScript中的行为略有不同 与其他语言相比。它之间也有一些差异 严格模式和非严格模式。在大多数情况下,
this
的值取决于函数的来源 调用。它不能在执行期间通过赋值来设置,它可能是 每次调用函数时都不同。 ES5引入了绑定 无论如何设置函数值的方法都是如此 调用,ECMAScript 2015引入了箭头函数 词法范围(它被设置为封闭的这个值 执行上下文)。
当一个函数作为一个对象的方法被调用时,它的this
被设置为调用该方法的对象。因此,this.lol
工作正常并等于只调用lol
,因为他们都在范围内。
但调用thos.lol
时会发生什么?由于this
设置了对象属性值,因此虚拟机认为this
在全局范围内:
在全局执行上下文中(在任何函数之外),这指的是全局对象,无论是否处于严格模式。
因此,您调用thos.lol
,它会看到全局对象并为您提供未定义的错误。尝试在控制台中obj.obj2.obj3.thos.lol;
,您将看到未定义。在控制台中尝试obj.obj2.obj3.thos;
,您将看到全局对象。
答案 2 :(得分:2)
this
是指对象属性中引用的父对象。在pap()
方法的内部,您可以声明:
var thos = this;
然后你可以这样做:
console.log(thos.lol);
答案 3 :(得分:0)
当您不在范围内时,您正试图访问thos
。 pap: function() { }
创建了一个新的功能范围,对thos
一无所知,因此您需要将其传入或执行console.log(obj.obj2.obj3.thos.lol);
而不仅仅是console.log(thos.lol);