Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 这个变量声明代码在做什么?_Javascript - Fatal编程技术网

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

Javascript 这个变量声明代码在做什么?,javascript,Javascript,我浏览了jade模板引擎的源代码,试图弄明白这句话的意思 我知道它将尝试实例化options.compiler,如果失败,则实例化compiler,但下一部分让我困惑。。。这是说调用parser.parse并将返回值声明为变量吗?如果是这样的话,为什么最右边的选项是围绕选项的 var compiler = new (options.compiler || Compiler)(parser.parse(), options) , js = compiler.compile(); . 如果有帮

我浏览了jade模板引擎的源代码,试图弄明白这句话的意思

我知道它将尝试实例化
options.compiler
,如果失败,则实例化
compiler
,但下一部分让我困惑。。。这是说调用
parser.parse
并将返回值声明为变量吗?如果是这样的话,为什么最右边的选项是围绕选项的

var compiler = new (options.compiler || Compiler)(parser.parse(), options)
  , js = compiler.compile();
.
如果有帮助的话,这里有更多的上下文

function parse(str, options){
  try {
    // Parse
    var parser = new Parser(str, options.filename, options);

    // Compile
    var compiler = new (options.compiler || Compiler)(parser.parse(), options)
      , js = compiler.compile();
var compiler=new(options.compiler | | compiler)
不尝试实例化
options.compiler
。它寻找
编译器
构造函数作为
选项
的属性。如果找不到它,它将使用
编译器
作为构造函数

然后它只将这两个参数传递给正在使用的构造函数:第一个参数是
parser.parse()
的返回值,第二个参数是
options


为了简化,可以将其改写如下:

var theConstructor = options.compiler || Compiler;
var parsedStuff = parser.parse();
var compiler = new theConstructor(parsedStuff, options);
var compiler=new(options.compiler | | compiler)
不尝试实例化
options.compiler
。它寻找
编译器
构造函数作为
选项
的属性。如果找不到它,它将使用
编译器
作为构造函数

然后它只将这两个参数传递给正在使用的构造函数:第一个参数是
parser.parse()
的返回值,第二个参数是
options


为了简化,可以将其改写如下:

var theConstructor = options.compiler || Compiler;
var parsedStuff = parser.parse();
var compiler = new theConstructor(parsedStuff, options);

这看起来很有趣,因为要调用的构造函数本身就是一个表达式

不,它并不是将
parser.parse()
作为声明的本地
编译器的值进行计算,
而是从返回的对象创建一个新对象,并由此初始化
编译器


而且,最右边的paren仅仅是因为代码知道无论返回什么构造函数。。。它需要两个参数。

看起来很有趣,因为要调用的构造函数本身就是一个表达式

不,它并不是将
parser.parse()
作为声明的本地
编译器的值进行计算,
而是从返回的对象创建一个新对象,并由此初始化
编译器

而且,最右边的paren仅仅是因为代码知道无论返回什么构造函数。。。它将需要两个参数。

让我们将其分解

(options.compiler || Compiler)
这个表达式似乎是为了寻找一个“类”(从技术上讲是一个构造函数,这就是JavaScript)。options对象可用于指定它,否则它将返回到
编译器所引用的任何对象

new (options.compiler || Compiler)(/* ... */)
好了,现在这更有意义了。我们正在调用一个构造函数。只是“类”是动态选择的

new (options.compiler || Compiler)(parser.parse(), options)
当我们输入构造函数时,我们传入了两个参数。第一个是调用
parser
对象的
parse
方法的结果,第二个是前面的options对象

var compiler = new (options.compiler || Compiler)(parser.parse(), options)
这种不洁的混乱存储在
编译器
变量中

var compiler = new (options.compiler || Compiler)(parser.parse(), options), js = compiler.compile();
您可以在同一个
var
语句中声明和分配多个变量,这样会进一步混淆问题。但最后一部分很容易理解

这句话可以,也可能应该,分解成多行。。。但事实就是这样。

让我们把它分解一下

(options.compiler || Compiler)
这个表达式似乎是为了寻找一个“类”(从技术上讲是一个构造函数,这就是JavaScript)。options对象可用于指定它,否则它将返回到
编译器所引用的任何对象

new (options.compiler || Compiler)(/* ... */)
好了,现在这更有意义了。我们正在调用一个构造函数。只是“类”是动态选择的

new (options.compiler || Compiler)(parser.parse(), options)
当我们输入构造函数时,我们传入了两个参数。第一个是调用
parser
对象的
parse
方法的结果,第二个是前面的options对象

var compiler = new (options.compiler || Compiler)(parser.parse(), options)
这种不洁的混乱存储在
编译器
变量中

var compiler = new (options.compiler || Compiler)(parser.parse(), options), js = compiler.compile();
您可以在同一个
var
语句中声明和分配多个变量,这样会进一步混淆问题。但最后一部分很容易理解


这句话可以,也可能应该,分解成多行。。。但是它就是这样。

new(options.compiler | | compiler)
必须返回一个带两个参数的函数……这只是构造函数的第二个参数。
new(options.compiler | | compiler)
必须返回一个带两个参数的函数……这只是构造函数的第二个参数。