我正在看看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) {
...
}
这一个使defsym
和defval
函数可以在母函数的整个范围内使用。
为什么他们会选择第一种语法?为什么不用其他语法?
答案 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(){};
唯一的区别是第二个例子是存储函数而不是整数。