在Javascript/Coffeescript中,如何模拟模块';测试中的公共变量是什么?
我刚刚了解到这个问题。我已经编写了一些代码,这些代码变得非常复杂,我想测试一个特性。问题是,我不知道如何模拟一个值。下面是coffeescript,但我将把生成的javascript放在下面,以便获得更多帮助。下面是我的测试,它试图模拟一个名为在Javascript/Coffeescript中,如何模拟模块';测试中的公共变量是什么?,javascript,coffeescript,global-variables,module-pattern,Javascript,Coffeescript,Global Variables,Module Pattern,我刚刚了解到这个问题。我已经编写了一些代码,这些代码变得非常复杂,我想测试一个特性。问题是,我不知道如何模拟一个值。下面是coffeescript,但我将把生成的javascript放在下面,以便获得更多帮助。下面是我的测试,它试图模拟一个名为state的字段,但它总是打印“undefined”: 这里是test2,就这个问题而言,它可以被视为生产代码: root = exports ? this root.test2 = (-> state = undefined doSome
state
的字段,但它总是打印“undefined”:
这里是test2,就这个问题而言,它可以被视为生产代码:
root = exports ? this
root.test2 = (->
state = undefined
doSomething = -> alert state
return {
state: state
doSomething: doSomething
}
)()
这是我正在运行的html,但我认为这无关紧要:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>TEST2</title>
<script src="test2.js" type="text/javascript"></script>
<script src="test3.js" type="text/javascript"></script>
<style>
canvas {
border: 1px solid black;
}
</style>
</head>
<body>
<h1>This is a test</h1>
</body>
</html>
Javascript中的test3:
var root;
root = typeof exports !== "undefined" && exports !== null ? exports : this;
root.test2 = (function() {
var doSomething, state;
state = void 0;
doSomething = function() {
return alert(state);
};
return {
state: state,
doSomething: doSomething
};
})();
var root;
root = typeof exports !== "undefined" && exports !== null ? exports : this;
root.test3 = (function() {
root.test2.state = "abc";
root.test2.doSomething();
return {};
})();
正如我所说,运行此命令会提醒
未定义。我希望它输出“abc”。我该怎么做呢?如果你想在这种情况下使用“this”
doSomething = function() {
return alert(this.state);
};
在代码中,“state”指的是未定义的变量(通过闭包)。然后返回一个包含新“state”属性的对象。您不需要第一个“state”变量,只需要返回对象中的属性
doSomething中的“this”指的是它所属的任何对象。在test3中,doSomething引用“state”设置为未定义的返回对象。一旦在test3中设置了state,对象的“state”属性就不再与test2中的私有变量“state”相同——它在test3中被覆盖
基本上,您不需要模块模式来实现所需的效果,有一种更简单的方法:
root.test2 = {
state: void 0,
doSomething: function() {
return alert(this.state);
}
};
更新::我忘记了咖啡部分的所有内容:
root = exports ? this
root.test2 = (->
doSomething = -> alert this.state
return {
state: undefined
doSomething: doSomething
}
)()
或者,简单地说:
root = exports ? this
root.test2 = {
state: undefined
doSomething: -> alert this.state
}
在doSomething的函数定义中…?好的,这非常有用,但是如果我想模拟一个函数而不是一个变量呢?想象一下doSomething
调用函数名alertABC()
。如何更改test3中的alertABC()
功能?
root = exports ? this
root.test2 = {
state: undefined
doSomething: -> alert this.state
}