我开始使用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我只发现了新的被调用的例子:object = new Someting
所以问题是:new
在这种情况下如何运作?它是否将less.Parser
称为构造函数?另外,什么是括号(在新的调用之后)执行/返回?
谢谢!
答案 0 :(得分: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是一种loose type语言,在tokens中进行了解释。这意味着只要语法得到尊重,它的语法就不会太受限制。
这让事情如下:
var a = false;
var b = function() { };
var c = false;
new(a || b || c)();
完全有效,并将创建b
的新实例,因为它是在测试变量a
之后定义的第一个非假值。 (注意,它不会检查b
是否实际上是function
。如果b
是非假的而不是函数,则JS引擎会抛出它在运行时不是函数-time)
答案 1 :(得分:1)
真的只是评论。
表达式new(less.Parser)({…})
与new less.Parser({…})
相同。
括号是一个分组运算符,表示“将此表达式计算为单个表达式”。当括号中的表达式返回不带括号的不同结果时,通常使用该语法,例如
var x, y = 7;
alert( typeof (x || y)) // "number"
alert( typeof x || y ) // "undefined"
但是因为它们对OP的结果没有任何影响,所以它们毫无意义并且可能有害,因为它们将一个众所周知的模式转换为某些可能看起来好像new
可以被称为函数的模式。