在Javascript/Coffeescript中,如何模拟模块';测试中的公共变量是什么?

在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

我刚刚了解到这个问题。我已经编写了一些代码,这些代码变得非常复杂,我想测试一个特性。问题是,我不知道如何模拟一个值。下面是coffeescript,但我将把生成的javascript放在下面,以便获得更多帮助。下面是我的测试,它试图模拟一个名为
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
}