处理这个关键字

时间:2016-01-20 18:46:08

标签: javascript this

刚才我开始使用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()

4 个答案:

答案 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)

As MDN tells us:

  

函数的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)

当您不在范围内时,您正试图访问thospap: function() { }创建了一个新的功能范围,对thos一无所知,因此您需要将其传入或执行console.log(obj.obj2.obj3.thos.lol);而不仅仅是console.log(thos.lol);

相关问题