我在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.prototype
是envCtor
,"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>