这个变量声明代码在做什么?

时间:2013-01-25 05:11:03

标签: javascript

我正在浏览玉石模板引擎源代码,我试图找出这个陈述的含义。

我知道它会尝试实例化options.compiler,如果那次实例化Compiler失败,但下一部分让我感到困惑......这就是说{{1}并将返回的值声明为变量?如果是这样,那为什么最合适的选择呢?

parser.parse


如果有帮助,可以在这里找到更多背景信息

var compiler = new (options.compiler || Compiler)(parser.parse(), options)
  , js = compiler.compile();

Github - Line 960

3 个答案:

答案 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只是因为代码知道无论返回什么构造函数......它都需要两个参数。