循环引用导致的undefined问题

问题描述

两个JS文件存在循环import时,将导致undefined问题

import Type from "./test"
console.log(Type.Image);    //这里报错,说Type是个undefined,不能去取它的Image属性

原因分析

如下两个js,假定先加载a.js:

//a.js
console.log("before import b")
import {b} from "./b"
console.log("b is " + b)
export let a = b+1;

//b.js
console.log("before import a")
import {a} from "./a"
console.log("a is " + a)
export let b = a+1;

结果是

before import a
a is undefined
before import b
b is NAN

这里有一个有趣的现象就是第一句输出并不是before import b,也就是虽然import语句在后面,但确会更早执行,当执行import b时,加载并运行b.js,从而第一句输出是before import a。

然后就是当运行b.js时,发现又需要import a.js,此时不会再去加载a.js了,而是认为整个a.js模块是{},所以a的值就是undefined了。

如何避免

对于像constants, enum, global等一些需要立即执行的模块,定义Constants.js公共文件,从而避免循环依赖。

参考

Module 的循环加载

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 系列文章导航 模块(一) CommonJs,AMD, CMD, UMD 本文参考阮一峰 ES6入门 Module的...
    合肥黑阅读 6,260评论 0 4
  • 上一章介绍了模块的语法,本章介绍如何在浏览器和 Node 之中加载 ES6 模块,以及实际开发中经常遇到的一些问题...
    emmet7life阅读 2,822评论 0 1
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,907评论 1 45
  • 你从图片上能看到什么? 一个漂亮的蓝色玻璃杯碎了,液体从桌子往下流,双手撑在桌沿上。 这是从图片上看到的,这张图是...
    小妮emily阅读 907评论 0 0
  • 一、选择题(每小题2分′共50分)。 1.我校的珍稀植物银杏树正茁壮成长,构成银杏树的基本结构和功能单位是 细胞组...
    月洋阅读 405评论 0 0