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、テストされた変数の後に定義された最初の非false値であるため、の新しいインスタンスを作成しますab(が実際にであるかどうかはチェックされないことに注意してくださいfunctionbが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 に答える