我在nodejs项目中遇到了以下函数调用。

var setEnv = function(envCtor) {
  if (typeof envCtor == 'string') {
    envCtor = ({
      node: ENV_node
    })[envCtor];
  }

  ENV = new envCtor({
    foo: foo,
    bar: bar
  });
  this.__env = ENV;
  this.__dir = ENV.getCwd();
};

function ENV_node() {
  //some code
};

setEnv('node');


我没有语法,有人可以帮助我了解此函数的功能吗?
TIA

最佳答案

我首先想了解envCtor = ({ node: ENV_node })[envCtor];在做什么


确定envCtor是字符串后,将其设置为以下任意一个:


ENV_node(如果envCtor"node"),或
如果Object.prototypeenvCtor"toString"等,则为标准对象属性(例如"valueOf"上的任何一个),或者
undefined


(考虑到以后它们对envCtor的处理,我不能保证他们有意做第二个。:-) toString不是构造函数。)

这样做的方法是,创建一个具有一个“自己的”属性node的对象,然后创建一组通常的继承属性,然后查找名称与envCtor字符串匹配的属性的值。这是分成几个部分的版本:

var tempObj = {node: ENV_node};
var newValue = tempObj[envCtor];
envCtor = newValue;


()的原因是为了避免与使用{node: ENV_node}创建块而不是对象混淆。但是,对它们没有真正的需求,可以将其删除。解析器不会将{视为块的开始,因为它出现在赋值运算符的右侧。

例:



var ENV_node = "the ENV_node value";
function test(envCtor) {
  var before = envCtor;
  envCtor = { node: ENV_node }[envCtor];
  snippet.log(before + " -> " + envCtor);
}
test("node");
test("toString");
test("foo");

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

10-05 20:44