Вызов JavaScript() и метод apply() и присвоение переменной

#javascript #call #apply #variable-assignment

#javascript #вызов #применить #присвоение переменной

Вопрос:

В настоящее время я изучаю 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. Потому что ваша функция конструктора не return присваивает значение. Это просто изменяет this объект.

2. Я хотел бы отметить это как опечатку, но я не уверен, что должен. На самом деле, вы спрашиваете, почему function doesNotReturnAnything() { console.log("this is the entire body") } при вызове не выдается значение.

3. Большое спасибо. Теперь мне все ясно.

Ответ №1:

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 остаются неопределенными.

Комментарии:

1. Я рад, что смог прояснить ситуацию для вас. Пожалуйста, выберите этот ответ как «правильный», если вы чувствуете, что он отвечает на ваш вопрос.