JavaScript, конструктор и «это» - PullRequest
0 голосов
/ 24 мая 2018

Есть кое-что, что я не понимаю с ключевым словом "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 () для объекта person.Почему это работает?Я думал, что мне нужно поместить "this.name" в мой метод.Потому что когда я запускаю person.go () внутри метода go (): имя не является параметром, не является локальной и не глобальной.Как движку JS удается понять, что означает «имя»?

Например, когда я это делаю:

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

person.go () не работает, потому что «имя» неизвестнои я должен добавить this.name, чтобы заставить его работать.

Я не понимаю, почему это работает в первом примере, но не во втором.

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

В первом случае значение name происходит из аргумента функции name.Метод go использует значение аргумента вместо контекста this.

Во втором случае name не определен в методе go.Вам необходимо предоставить контекст (this.name) для доступа к нему.

0 голосов
/ 24 мая 2018

Ваш код работает без this., потому что функция go захватила параметр name из функции конструктора в окружающей области видимости.Ваш код эквивалентен:

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

То есть вы фактически не используете свойство name вашего Person объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...