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) {
  ...
};

这将更清楚地表明这是两个局部变量。或者这个怎​​么样:

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

这使得defsymdefval函数在母函数的整个范围内都可用。

他们为什么会选择第一种语法?为什么不是其他语法?

4

3 回答 3

4

我认为这只是风格问题。前两个定义是等价的,但第一个更短,因为您不必在每个定义前加上var.

将除函数之外的其他值分配给 vars 也是如此。例如

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

是相同的

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

这真的归结为个人喜好(我更喜欢第二种风格)。

于 2012-11-21T15:40:53.107 回答
4

他们为什么不使用Syntax B?因为它需要更多的字符。

他们为什么不使用Syntax C?因为它的含义并不完全相同。函数声明与函数表达式并不完全相同。


现在我看到分配发生在 a 中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 回答
2

这是一个简单的 var 声明。

如果这是有效的:

var number1 = 1, number2 = 2;

这也是有效的:

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

唯一的区别是第二个例子是存储函数而不是整数。

于 2012-11-21T15:41:55.067 回答