ES6模块导出的问题

a.js中,用export导出模块:

var count = 30;
var increaseAge = function () {
    count = count + 1;
}

export {count, increaseAge};

b.js中引入模块a.js:

import {count , increaseAge} from "./a";
console.log(count); // 30
increaseAge();
console.log(count); // 31

两次输出count分别为30和31,这个可以理解,因为引入的是一个模块对象,属性分别为count和increaseAge。

但是,当尝试用export default改写这个例子时,结果完全不同。
a.js如下:

var count = 30;
var increaseAge = function () {
    count = count + 1;
}
export default {count, increaseAge};

b.js如下:

import A from './a';
console.log(A.count); // 30
A.increaseAge();
console.log(A.count); // 30

为什么count第二次输出还是30?
求大神解答,万分感谢!

阅读 3.9k
2 个回答

export default只能导出一个module,你并没有导出count

export default {count, increaseAge}是应用了es6的对象属性简写语法
而export {count, increaseAge}则是应用了export多个值的语法
两者的语义完全不同

扩展开的话,两者分别是这样

//等同于export {count, increaseAge}
export count
export increaseAge

//等同于export default {count, increaseAge}
let defaultModule = {
    count: count,
    increaseAge: increaseAge
}
export default defaultModule

在default的情况下,export出去的是defaultModule,上面有一个count属性,在赋值给defaultModule之后,就和原count没有关系了,而increaseAge改变的是闭包内的原count,你打印defaultModule.count自然不会有变化

新手上路,请多包涵

你把count赋值给了一个对象的count属性,而count并不是引用类型,然后你导出了此对象。你调用increaseCount方法的时候改变的是原来的count,而不是你导出对象的count

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进