Javascript 具有扩展类和模块的es6变量范围

Javascript 具有扩展类和模块的es6变量范围,javascript,class,ecmascript-6,node-modules,Javascript,Class,Ecmascript 6,Node Modules,为什么es6不允许这样做?我知道消息只在警报模块中定义,而在基本模块中没有定义,但我(显然是错误地)认为,既然警报类可以访问它,所有类都应该。。。想法 //file component.js import Base from './base'; const message = "hello"; class Alert extends Base { initialize() { this.render(); } } export default Alert; 及

为什么es6不允许这样做?我知道消息只在警报模块中定义,而在基本模块中没有定义,但我(显然是错误地)认为,既然警报类可以访问它,所有类都应该。。。想法

//file component.js
import Base from './base';
const message = "hello";
class Alert extends Base {
    initialize() {
        this.render();
    }
}
export default Alert;


这不起作用,因为JavaScript没有动态作用域

词法范围意味着变量是否可访问取决于它们在源文本中出现的位置,而不取决于运行时信息

简化示例:

function foo() {
  var bar = 42;
  baz();
}

function baz() {
  console.log(bar); // error because bar is not in the scope of baz
}

注意:这对于类或ES6来说并不新鲜,一直都是这样。

这不起作用,因为JavaScript没有动态作用域

词法范围意味着变量是否可访问取决于它们在源文本中出现的位置,而不取决于运行时信息

简化示例:

function foo() {
  var bar = 42;
  baz();
}

function baz() {
  console.log(bar); // error because bar is not in the scope of baz
}

注意:这对于类或ES6来说并不新鲜,一直都是这样。

基本类及其方法无法访问
组件
模块中的任何变量,该模块有自己的作用域。如果要导入模块,则可以访问导出的值,但不能访问本地
消息
变量

我认为您应该在这里使用类的静态属性,当在
警报
实例上调用时,
方法可以访问该类:

import Base from './base';
export default class Alert extends Base {
    initialize() {
        this.render();
    }
}
Alert.message = "hello"; // not constant, though; you'd need to use
                         // Object.defineProperty(Alert, "message", {value: …} for that


另请参见
this.constructor….
的工作原理。

基本
类及其方法无法访问
组件
模块中的任何变量,该模块有自己的作用域。如果要导入模块,则可以访问导出的值,但不能访问本地
消息
变量

我认为您应该在这里使用类的静态属性,当在
警报
实例上调用时,
方法可以访问该类:

import Base from './base';
export default class Alert extends Base {
    initialize() {
        this.render();
    }
}
Alert.message = "hello"; // not constant, though; you'd need to use
                         // Object.defineProperty(Alert, "message", {value: …} for that


另请参见
this.constructor….
的工作原理。

这正是我想要的。谢谢这正是我想要的。谢谢谢谢你的回答!我并不是很关心解决问题,而是理解问题的局限性。是的,我只是不想重复费利克斯已经写过的内容:-)谢谢你的回答!我不太关心解决问题的方法,而是理解其局限性。是的,我只是不想重复费利克斯已经写过的内容:-)