我已经查看了与此错误相关的几个问题,而且大多数问题似乎都误解了关键字this
的含义。我不认为我在这里有这个问题。我可能是某种循环依赖问题,我无法很好地表达出来以便自己解决这个问题。
我试图将我的问题提炼成下面的三个文件。
var A = require('../lib/a');
var Something = function (type) {
this.type = type;
};
Something.prototype.setTemplate = function (template) {
this.template = template;
};
Something.prototype.applyTemplate = function () {
var templateResult = this.template.calculate();
};
var factory = {};
factory.createSomething = function(type) {
return new Something(type);
};
factory.createA = function (input) {
return A.Make(input);
};
module.exports = factory;
var S = require('../prof/something');
var _ = require('underscore');
var A = function (input) {
this.input = input;
};
A.prototype.calculate = function () {
var calculation = 0;
var _s = S.createSomething('hello world');
// do calculation using input
return calculation;
};
var factory = {};
factory.Make = function (input) {
var a = new A(input);
return a;
};
module.exports = factory;
describe('Unit: A Test', function() {
var S = require('../prof/something');
it('test 1', function() {
var a = S.createA({
//input
});
var s = S.createSomething('type1');
s.setTemplate(a);
s.applyTemplate(); // error
});
});
错误从评论a_test.js
的行//error
的顶层开始抛出。在最低级别,'不是一个功能' a.js
方法在S.createSomething(type)
中抛出错误。它说S.createSomething()
不是函数。
我在该行放置了一个断点,并尝试从下划线库中调用函数,但它给出了相同的错误。所以似乎a.js
中的require语句不会抛出错误,但是没有一个注入的对象可以用来调用函数。正在使用karma库运行a_test.js
文件。
我是否通过在A和S之间来回引用来违反某些javascript范例?我该怎么做呢?
编辑:我已经做了一些进一步的测试。如果测试文件看起来像这样,实际上并不重要:
describe('Unit: A Test', function() {
var S = require('../prof/something');
it('test 1', function() {
var a = S.createA({
//input
});
a.calculate(); // error
});
});
上述行仍然会出现错误。
答案 0 :(得分:0)
问题中的文件互相引用。这称为循环依赖。解决方案是将var S = require('../prof/something');
语句移动到calculate函数中,如下所示:
// move the line from here
var _ = require('underscore');
var A = function (input) {
this.input = input;
};
A.prototype.calculate = function () {
var S = require('../prof/something'); // to here
var calculation = 0;
var _s = S.createSomething('hello world');
// do calculation using input
return calculation;
};
var factory = {};
factory.Make = function (input) {
var a = new A(input);
return a;
};
module.exports = factory;