#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. Я рад, что смог прояснить ситуацию для вас. Пожалуйста, выберите этот ответ как «правильный», если вы чувствуете, что он отвечает на ваш вопрос.