所谓循环依赖就是a依赖b,b也同时依赖a。
在a执行到require('b')的地方时会停下来去调用b,当去执行b,执行到一半发现require('a'),就停下来去调用a。
解决方案:
当出现循环依赖时,就不要依赖前置加载了,在b需要调用a的某个方法的那个地方先就近加载:var a = require('a'),然后再去调用b中的方法,代码实例如下:
代码语言:javascript复制[JavaScript] 纯文本查看 复制代码12345678//b.js:define(["require", "a"], function(require, a) { return function(title) { return require("a").doSomething(); } });
虽然循环依赖是比较少见的,但是有时候还是会遇到的,下面再介绍一种解决方案:
如果熟悉CommonJS,可以使用exports为模块建立一个空object,该object可以立即被其他模块引用。在循环依赖的两头都如此操作之后,就可以安全地持有其他模块了。这种方法仅在每个模块都是输出object作为模块值的时候有效,换成函数无效。
代码语言:javascript复制[JavaScript] 纯文本查看 复制代码1234567// b.js:define(function(require, exports, module) { var a = require("a"); exports.foo = function () { return a.bar(); };});
或者,如果你使用依赖注入数组的步骤,则可用注入特殊的"exports"来解决(pos):
代码语言:javascript复制[JavaScript] 纯文本查看 复制代码123456// b.js:define(['a', 'exports'], function(a, exports) { exports.foo = function () { return a.bar(); };});