使用逗号运算符链接多个函数定义

时间:2012-11-21 15:32:37

标签: javascript uglifyjs

我正在看看Uglify-js的源代码,我注意到了一些有趣的东西。在bin/uglifyjsref)中,有两个函数定义如下:

//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函数可以在母函数的整个范围内使用。

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

3 个答案:

答案 0 :(得分:4)

我认为这只是一种风格问题。前两个定义是等效的,但第一个定义较短,因为您不必为每个定义添加var前缀。

将相同的值分配给vars的函数也是如此。 E.g。

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

相同
var a = "a";
var b = "b";

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

答案 1 :(得分:4)

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

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


现在我看到作业发生在try/catch,这意味着他们在一个区块内。

在块中声明函数是无效的(即使某些实现允许)

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

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

这就解释了为什么他们没有选择Syntax C

此外,“严格模式”将通过抛出错误绝对禁止此类无效声明。

答案 2 :(得分:2)

这是一个简单的var声明。

如果这是有效的:

var number1 = 1, number2 = 2;

这也是有效的:

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

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