3

Uglify-js のソースコードを見ていると、面白いことに気が付きました。bin/uglifyjs( ref )では、いくつかの関数が次のように定義されています。

//syntax A
var defsym = function(sym) {
  ...
},
defval = function(v) {
  ...
};

Uglify-js が専門家によって書かれ、JQuery のような多くの製品で使用されていることを考えると、コードが次のように書かれていない理由がわかりません。

//syntax B
var defsym = function(sym) {
  ...
};
var defval = function(v) {
  ...
};

これにより、これらが 2 つのローカル変数であることがより明確になります。またはこれはどうですか:

//syntax C
function defsym(sym) {
  ...
}
function defval(v) {
  ...
}

これにより、マザー関数のスコープ全体でdefsymand関数を使用できるようになります。defval

なぜ彼らは最初の構文を選ぶのでしょうか? なぜ他の構文ではないのですか?

4

3 に答える 3

4

なぜ彼らは使わないのSyntax Bですか?より多くの文字が必要になるためです。

なぜ彼らは使わないのSyntax Cですか?その意味は完全に同じではないからです。関数宣言は、関数式とまったく同じではありません。


これで、割り当てが で行われていることがわかりますtry/catch。これは、それらがブロック内にあることを意味します。

ブロック内で関数を宣言することは無効です (一部の実装では許可されていますが)

 // Invalid
try {
    function defsym(sym) {
        // ...
    }
    // ...
} catch(e) {
    // ...
}

 // Valid
try {
    var defsym = function(sym) {
        // ... 
    },
    // ...
} catch(e) {
    // ...
}

だから、これは彼らが選ばなかった理由を説明していますSyntax C.

また、「厳密モード」は、エラーをスローすることにより、そのような無効な宣言を絶対に禁止します。

于 2012-11-21T15:52:20.220 に答える
4

これは単にスタイルの問題だと思います。最初の 2 つの定義は同等ですが、各定義の前にvar.

関数以外の値を vars に代入する場合も同様です。例えば

var a = "a",
    b = "b";

と同じです

var a = "a";
var b = "b";

それは本当に個人的な好みに要約されます (私は 2 番目のスタイルがより好きです)。

于 2012-11-21T15:40:53.107 に答える
2

This is a simple var declaration.

if this is valid:

var number1 = 1, number2 = 2;

this is also valid:

var func1 = function(){}, func2 = function(){};

The only difference is that the second example is storing functions instead of integers.

于 2012-11-21T15:41:55.067 に答える