Вызов JavaScript () и apply () Метод и назначение переменных - PullRequest
1 голос
/ 07 марта 2019

Я сейчас изучаю JavaScript, используя книгу. Пример объясняет двойное назначение функций.

function Person(name) {
  if (this instanceof Person) {
    this.name = name
  } else {
    throw new Error("Nutze new")
  }
}
let aPerson = new Person("Astrid"); 
// let aPerson = Person("Astrid"); // throws an error
let notAPerson = Person.apply(aPerson, ["Elmar"]);
let notAPerson2 = Person.call(aPerson, "Peter");
console.log(aPerson); //  Object { name: "Peter" }
console.log(notAPerson); //  undefined
console.log(notAPerson2); //  undefined

Я понимаю, что я могу установить contex с помощью метода apply() или call(). Но я не понимаю, почему переменные notAPerson и notAPerson2 не определены?

Было бы замечательно, если бы кто-то мог мне это объяснить.

1 Ответ

1 голос
/ 07 марта 2019

ключевое слово new изменяет способ выполнения вашей функции.При использовании без new он делает именно то, что говорит в теле функции.Но когда вы вызываете функцию с помощью new, она работает примерно так:

function Person(name) {
  var this = {}
  if (this instanceof Person) {
    this.name = name
  } else {
    throw new Error("Nutze new")
  }
  return this
}

Поэтому, когда вы вызываете функцию с помощью new, this - это совершенно новый объект, который возвращаетсяавтоматически.Когда вы вызываете функцию позже без new, this - это объект aPerson, который вы создали ранее, потому что вы явно устанавливаете контекст, используя call и apply.Кроме того, когда вы не используете new, функция ничего не возвращает, она присваивает только this, поэтому notAPerson и notAPerson2 остаются неопределенными.

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