JavaScript,构造函数和“this”

时间:2018-05-24 14:27:53

标签: javascript this ecmascript-5

对于“this”关键字,我不明白这一点,更准确地说,当没有“this”时。像这个例子:

function Person(name) {
    this.name=name;
    this.go = function() {
        console.log("My name is " + name);
    }
}

let person = new Person("Peter");
person.go();

我的问题是当我在人物对象上调用go()时。它为什么有效?我以为我需要在我的方法中加入“this.name”。 因为当我运行person.go()时,go()方法内部:name不是参数,也不是局部变量而不是全局变量。 JS引擎如何设法理解“名称”的含义?

例如,当我这样做时:

var person = {
   name: "Peter",
   go: function() {console.log("My name is " + name);}
};

person.go()不起作用,因为“name”未知,我必须添加this.name才能使其正常工作。

我不明白为什么它在第一个例子中起作用而在第二个例子中不起作用。

由于

2 个答案:

答案 0 :(得分:3)

您的代码在没有this.的情况下工作,因为go函数已从周围范围内的构造函数捕获name参数。您的代码相当于:

function Person(xyz) {
    this.name=xyz;
    this.go = function() {
        console.log("My name is " + xyz);
    }
}

IE您实际上并没有使用name对象的Person属性。

答案 1 :(得分:1)

在第一种情况下,name值来自函数参数namego方法使用参数的值,而不是this上下文。

在第二种情况下,name方法中未定义go。您需要提供上下文(this.name)才能访问它。