由于构造函数本质上是一个存储为副本的对象,因此看起来它们就像变量一样,因为它们在代码中不能仅仅是“ Anywhere”,例如带有函数?
因此,它们基本上需要位于构造函数被调用的位置或代码中的原型之上,否则它们将是未定义的或未被发现的...
别人能为我确认情况确实如此吗?
谢谢!
答案 0 :(得分:0)
在JavaScript中,声明为hoisted,使代码执行时就像将这些声明实际写在其包围范围的顶部一样。声明可以是变量声明或函数声明。因此,您可以以一种似乎在声明之前就使用某种东西的方式来编写代码,但是实际上,由于吊装,您并不是这样。
变量声明吊装:
console.log(x); // undefined because x hasn't been initialized, but has been declared
var x = "test";
console.log(x); // "test" because the assignment has now been processed
console.log(y); // error because y has never been decalred
功能声明悬挂:
foo(); // "hello from foo" because the entire function declaration was hoisted.
function foo(){
console.log("hello from foo");
}
Classes are not hoisted,因此在使用它们之前必须先编写它们。
类吊装尝试:
const p = new Rectangle(); // ReferenceError
class Rectangle {
constructor(height, width) {
this.height = height;
this.width = width;
}
}
就是这么简单。
答案 1 :(得分:0)
变量只是存储和引用值的一种手段。对象是一种值的类型。函数是一种对象。构造函数是一种设计为使用new
关键字调用的函数(它将创建一个对象并在其上建立原型链)。
要调用构造函数,您需要有权访问该值。这可以通过变量(通常是)来实现。
该变量必须包含构造函数,然后才能引用它。
函数 declaration 是创建函数的一种方法,该函数可以是构造函数,它是提升的,允许在代码中更早地使用它。出现。
但是,构造函数通常在原型中添加了许多方法,而在下面的示例中并未使用这些方法:
var fido = new Dog("Fido");
fido.bark();
function Dog(name) {
this.name = name;
}
Dog.protype.bark = function () {
alert(`Woof! I'm ${this.name}`);
}