由于ES6类只是JavaScript现有的基于原型的继承[1]的语法糖,因此(IMO)提升它的定义是有意义的:
var foo = new Foo(1, 2); //this works
function Foo(x, y) {
this.x = x;
this.y = y;
}但以下几点是行不通的:
var foo = new Foo(1, 2); //ReferenceError
class Foo {
constructor(x, y) {
this.x = x;
this.y = y;
}
}为什么ES6课程没有被悬挂?
发布于 2016-02-21 15:26:40
为什么ES6课程没有被悬挂?
实际上,它们是挂起的(变量绑定在整个作用域中可用),就像是一样--它们只是没有初始化。
提升它的定义是有意义的
不是的。在定义类之前使用类从来都不是一个好主意。考虑一下这个例子
var foo = new Bar(); // this appears to work
console.log(foo.x) // but doesn't
function Bar(x) {
this.x = x || Bar.defaultX;
}
Bar.defaultX = 0;并将其与
var foo = new Bar(); // ReferenceError
console.log(foo.x);
class Bar {
constructor (x = Bar.defaultX) {
this.x = x;
}
}
Bar.defaultX = 0;如您所期望的那样抛出一个错误。这是一个静态属性,原型混合器,装饰和所有东西的问题。此外,子类也非常重要,当您使用一个类及其未经调整的原型时,子类在ES5中完全崩溃,但如果还没有初始化extended类,则会抛出一个错误。
发布于 2019-02-06 23:02:14
虽然非挂起的类(在某种意义上它们的行为类似于let绑定)可以被认为更好,因为它们会导致更安全的使用(参见Bergi的回答),但2度博客上的以下解释似乎为这种实现提供了一个稍微更基本的原因:
这种限制的原因是类可以有一个值为任意表达式的
extends子句。该表达式必须在适当的“位置”中进行计算,其评估不能被悬挂。
发布于 2017-09-17 13:41:23
Javascript中的所有声明(var、let、const、function、function*、class)都是悬挂的,但它应该在相同的作用域中声明。
正如您所说的,"ES6类只是JavaScript现有的基于原型的继承的一种语法糖“。
,那么让我们了解一下它是什么?
这里您声明了一个类,它实际上是“特殊函数”。让我们假设您的函数Foo()和类Foo都在全局范围内。
class Foo {
constructor(x, y) {
this.x = x;
this.y = y;
}
}下面是类Foo的编译代码。
var Foo = (function () {
function Foo(x, y) {
this.x = x;
this.y = y;
}
return Foo;
}());在内部,类以相同的名称在包装器函数(Iife)中转换为函数,该包装函数返回您的函数。
因为您的函数的(类)作用域发生了更改。你试图在全局范围内创建函数对象,而这实际上是不存在的。
一旦编译完成,就会得到变量Foo中的函数。因此,稍后您可以在var中使用函数来创建该对象。
https://stackoverflow.com/questions/35537619
复制相似问题