Javascript 为什么“导出默认常量”无效?

Javascript 为什么“导出默认常量”无效?,javascript,scope,export,constants,default,Javascript,Scope,Export,Constants,Default,我认为以下几点很好: const Tab = connect( mapState, mapDispatch )( Tabs ); export default Tab; 但是,这是不正确的: export default const Tab = connect( mapState, mapDispatch )( Tabs ); 但这很好: export default Tab = connect( mapState, mapDispatch )( Tabs ); 请解释一下为什么const

我认为以下几点很好:

const Tab = connect( mapState, mapDispatch )( Tabs );
export default Tab;
但是,这是不正确的:

export default const Tab = connect( mapState, mapDispatch )( Tabs );
但这很好:

export default Tab = connect( mapState, mapDispatch )( Tabs );

请解释一下为什么
const
导出默认值
一起无效?这是一个不必要的添加&任何声明为
导出默认值
的内容都被假定为
常量
或类似的内容

const
类似于
let
,(VariableStatement,Declaration),用于定义块中的标识符

您正试图将其与
default
关键字混合,以遵循它

因此,它是一个语法错误


如果要
const
某些内容,则需要提供标识符,而不是使用
default

export
本身接受右侧的可变语句或声明


以下是精细的
导出默认选项卡

选项卡
成为AssignmentExpression,因为它被指定为默认名称


导出默认选项卡=连接(mapState,mapDispatch)(选项卡)很好

这里
Tab=connect(mapState,mapsdispatch)(Tabs)是一个赋值表达式


更新:想象问题的另一种方式

如果您试图从概念上理解这一点,而上面的规范推理没有帮助,请将其视为“如果
default
是合法标识符而不是保留令牌,那么编写
export default Foo;
export default const Foo=1;
的不同方式是什么?”

在这种情况下,扩展的编写方法是

//伪代码,这个思维实验是无效的
导出默认Foo;
//就像
export const default=Foo;
导出默认常量Foo=1;
//就像
导出常量默认常量Foo=1;
//那么下面这句话有意义吗?
常数棒常数Foo=1;
有一个有效的论点是,展开式应该是这样的

//伪代码,这个思维实验是无效的
导出默认常量Foo=1;
//就像
常数Foo=1;
export const default=Foo;

但是,这将变得不明确,因此显式地编写此模式更为合理。

如果要导出默认的const/let,而不是

const MyComponent = ({ attr1, attr2 }) => (<p>Now Export On other Line</p>);
export default MyComponent
constmycomponent=({attr1,attr2})=>(现在导出到另一行上

); 导出默认MyComponent
你可以这样做,我个人不喜欢

let MyComponent;
export default MyComponent = ({ }) => (<p>Now Export On SameLine</p>);
let MyComponent;
导出默认MyComponent=({})=>(现在在SameLine上导出

);
保罗的答案就是你想要的答案。然而,作为一个实际问题,我认为您可能对我在自己的React+Redux应用程序中使用的模式感兴趣

下面是我的一条路线中的一个简化示例,展示了如何定义组件并使用一条语句将其导出为默认值:

import React from 'react';
import { connect } from 'react-redux';

@connect((state, props) => ({
    appVersion: state.appVersion
    // other scene props, calculated from app state & route props
}))
export default class SceneName extends React.Component { /* ... */ }
(注意:我使用术语“场景”表示任何管线的顶级组件)


我希望这是有帮助的。我认为它比传统的
connect(mapState,mapDispatch)(BareComponent)

要干净得多。如果在文件名
MyComponent.js
中解释了组件名称,只需不命名组件,即可保持代码精简

import React from 'react'

export default (props) =>
    <div id='static-page-template'>
        {props.children}
    </div>
从“React”导入React
导出默认值(道具)=>
{props.children}
更新:由于这会在堆栈跟踪中将其标记为未知,因此不建议这样做

更新2:我只使用了下面的es5版本,因为它将名称保留在堆栈跟踪和react dev工具上

import React from 'react'

export default function MyComponent(props) {
    return (<div id='static-page-template'>
        {props.children}
    </div>)
}
从“React”导入React
导出默认函数MyComponent(道具){
返回(
{props.children}
)
}

保罗给出的答案是最好的。要扩大,

每个文件只能有一个默认导出。然而,可以有多个常量导出。默认变量可以使用任何名称导入,而const变量可以使用其特定名称导入

var message2='我被导出';
导出默认消息2;
export const message='我也被导出'
在导入端,我们需要像这样导入它:

从“/test”导入{message};

从“/test”导入消息;

在第一次导入中,const变量被导入,而在第二次导入中,默认变量将被导入。

对我来说,这只是typescript的许多特性(强调特性(t))中的一个,这些特性会导致人们拔出头发诅咒开发人员。也许他们可以想出更容易理解的错误信息

默认值
基本上是
常量someVariableName


您不需要命名标识符,因为它是文件的默认导出,您可以在导入时根据需要命名它,因此
default
只是将变量赋值压缩为单个关键字。

答案是它如何变成错误。问题仍然是为什么?它以这种方式防止常量滥用的一个原因是:导出默认常量a=1,b=3,c=4
“AFAIK导出本身不应向当前范围添加任何内容”
这不太准确,因为
export const a=1
a
添加到当前上下文中。即使在类的情况下使用
export default
,因为
export default class MyClass{}
也会将
MyClass
添加到当前上下文中。@SergeyOrlov同意这解释了如何产生错误,但没有说明为什么需要这样做。虽然我不确定这是唯一的原因,但你可能应该把它作为一个单独的答案,而不是对这个问题的评论;导出默认值a然后更新变量a,为什么e