// 简洁方法有一个非常小但是非常重要的缺点。思考下面的代码:
var Foo = {
bar() { /*..*/ },
baz: function baz() { /*..*/ }
};
// 去掉语法糖之后的代码如下所示:
var Foo = {
bar: function() { /*..*/ },
baz: function baz() { /*..*/ }
};
由 于 函 数 对 象 本 身 没 有 名 称 标 识 符, 所 以 bar() 的 缩 写 形 式
(
function()..
)实际上会变成一个
匿名函数表达式
并赋值给
bar
属性。相比之下,
具名函
数表达式
(
function baz()..
)会额外给
.baz
属性附加一个词法名称标识符
baz
。
匿名函数没有
name
标识符,这会导致:
1.
调试栈更难追踪;
2.
自我引用(递归、事件(解除)绑定,等等)更难;
3.
代码(稍微)更难理解。
var Foo = {
bar: function(x) {
if(x<10){
return Foo.bar( x * 2 );
}
return x;
},
baz: function baz(x) {
if(x < 10){
return baz( x * 2 );
}
return x;
}
};
使用
Foo.bar(x*2)
就足够了,但是在许多情况下无法使用这种方法,比如多个对 象通过代理共享函数、使用 this
绑定,等等。这种情况下最好的办法就是使用函数对象的
name
标识符来进行真正的自我引用。
使用简洁方法时一定要小心这一点。如果你需要自我引用的话,那最好使用传统的
具名函 数表达式来定义对应的函数(
· baz: function baz(){..}·
),不要使用简洁方法。