JavaScript call()和apply()方法和变量分配

时间:2019-03-07 20:19:45

标签: javascript call apply variable-assignment

我目前正在使用一本书学习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

我了解,我可以使用contexapply()方法设置call()。 但是我不明白,为什么变量notAPersonnotAPerson2未定义?

如果有人可以向我解释这一点,那就太好了。

1 个答案:

答案 0 :(得分: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对象,因为您正在使用callapply来显式设置上下文。 。另外,当您不使用new时,该函数不返回任何内容,它仅分配给this,这就是notAPersonnotAPerson2保持未定义状态的原因。 / p>