我在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
答案 0 :(得分:4)
我首先想了解
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>