我正在浏览玉石模板引擎源代码,我试图找出这个陈述的含义。
我知道它会尝试实例化options.compiler
,如果那次实例化Compiler
失败,但下一部分让我感到困惑......这就是说{{1}并将返回的值声明为变量?如果是这样,那为什么最合适的选择呢?
parser.parse
。
如果有帮助,可以在这里找到更多背景信息
var compiler = new (options.compiler || Compiler)(parser.parse(), options)
, js = compiler.compile();
答案 0 :(得分:2)
var compiler = new (options.compiler || Compiler)
不会尝试实例化 options.compiler
。它查找compiler
构造函数的存在作为option
的属性。如果找不到,则使用Compiler
作为构造函数。
然后它将这两个参数传递给正在使用的构造函数:第一个参数是parser.parse()
的返回值,第二个参数是options
。
为简化起见,可以按如下方式重写:
var theConstructor = options.compiler || Compiler;
var parsedStuff = parser.parse();
var compiler = new theConstructor(parsedStuff, options);
答案 1 :(得分:1)
让我们把它分解。
(options.compiler || Compiler)
这个表达式似乎是为了寻找一个“类”(好吧,技术上是构造函数,这是JavaScript)。 options对象可用于指定它,否则它将回退到Compiler
引用的任何内容。
new (options.compiler || Compiler)(/* ... */)
好的,现在这更有意义了。我们正在调用构造函数。只是动态选择了“阶级”。
new (options.compiler || Compiler)(parser.parse(), options)
当我们收获构造函数时,我们传递了两个参数。第一个是调用parse
对象的parser
方法的结果,第二个是前面的选项对象。
var compiler = new (options.compiler || Compiler)(parser.parse(), options)
那种不圣洁的混乱存储在compiler
变量中。
var compiler = new (options.compiler || Compiler)(parser.parse(), options), js = compiler.compile();
您可以在同一var
语句中声明和分配多个变量,这样就会进一步混淆。但最后一部分本身很容易理解。
这句话可以,而且可能应该分解成多行...但它就是它。
答案 2 :(得分:0)
看起来很有趣,因为要调用的构造函数本身就是一个表达式。
不,它不是将parser.parse()
计算为声明的本地compiler,
的值,而是从返回的对象和初始化 {创建一个新对象{1}}从那起。
而且,最右边的paren只是因为代码知道无论返回什么构造函数......它都需要两个参数。