2

我开始使用 Node.js,特别是 LessCSS 编译器。我在 lessc 脚本的源代码上看到了这个调用:

new(less.Parser) ({
    paths: [path.dirname(input)].concat(options.paths),
    optimization: options.optimization,
    filename: input,
    strictImports: options.strictImports,
    dumpLineNumbers: options.dumpLineNumbers
}).parse(data, function (err, tree) {
    //...
});

我不明白那个new(lessParser)({})电话是如何工作的。

从我一直在阅读的有关面向对象的 Javascript 的内容中,我只发现了 new 被调用的示例,如下所示:object = new Someting

所以问题是:在这种情况下如何new工作?less.Parser它是作为构造函数调用的吗?另外,括号(在新调用之后)执行/返回是什么?

谢谢!

4

2 回答 2

3

您发布的代码是确切地技术上(或多或少)与做的相同

var parserOptions = {
    paths: [path.dirname(input)].concat(options.paths),
    optimization: options.optimization,
    filename: input,
    strictImports: options.strictImports,
    dumpLineNumbers: options.dumpLineNumbers
};
var parser = new less.Parser(parserOptions);

parser.parse(data, function (err, tree) {
    //...
});

但是在“非常规”的地方有一些捷径和一些括号。

JavaScript 是一种松散类型的语言,它被解释为标记。这意味着只要尊重语法,它就不会过多地限制它的语法。

这让事情像:

var a = false;
var b = function() { };
var c = false;
new(a || b || c)();

完全有效,并将创建一个新实例,b因为它是在测试变量之后定义的第一个非假值a。(请注意,它不检查是否b实际上是一个function. 如果b是非 false 并且不是一个函数,JS 引擎会在运行时抛出它不是一个函数。)

于 2012-12-18T04:03:27.037 回答
1

真的只是一个评论。

表达式new(less.Parser)({…})与 相同new less.Parser({…})

括号是一个分组运算符,表示“将此表达式评估为单个表达式”。当括号中的表达式在没有括号的情况下返回不同的结果时,通常使用该语法,例如

var x, y = 7;

alert( typeof (x || y))  // "number"

alert( typeof  x || y )  // "undefined"

但是由于它们对 OP 中的结果没有任何影响,因此它们毫无意义并且可能有害,因为它们将众所周知的模式更改为在某些人看来似乎new可以作为函数调用的模式。

于 2012-12-18T05:25:26.543 回答