我正在阅读JS Book的Ninja Secrets并看到这部分示例代码:
var ninja = {
chirp: function signal(n) { //#1
return n > 1 ? signal(n - 1) + "-chirp" : "chirp";
}
};
var samurai = { chirp: ninja.chirp };
ninja = {};
所以我理解第一部分:我们有一个对象ninja
,它有一个方法。
我理解第二部分,现在我们正在创建一个名为samurai
的新对象,它有一个名为chirp
的属性。
困扰我的部分是ninja.chirp
部分,我们在这做什么?它是如何工作的?
答案 0 :(得分:5)
它接受chirp
对象(它是一个函数)的ninja
属性的值,并将其赋值给正在构造的对象的chirp
属性。
这是一个更简单的例子(使用字符串而不是函数):
var foo, bar;
foo = { "an": "object" };
bar = { "an": foo.an }
alert(foo.an);
alert(bar.an);
答案 1 :(得分:2)
我已经多次见过这个例子,这是一个可怕的例子。对于初学者来说,命名函数表达式在IE中是错误的,但除此之外它们完全没必要,因为你可以简单地引用arguments.callee
。
除此之外,使用递归函数重复字符串只是在寻找麻烦。整个事情可以简单得多:
function signal(n) {
return new Array(n+1).join("-chirp").substr(1);
}
答案 2 :(得分:1)
在此处,chirp
已将其复制到samurai
。您可以销毁ninja
对象,但仍然使用samurai.chirp
方法。