代码信息来自于http://ejohn.org/apps/learn/。
可以通过函数的名字在它的内部引用它。
function yell(n){ return n > 0 ? yell(n-1) + "a" : "hiy"; } console.log( yell(4) === "hiyaaaa", "在函数的内部通过它的名字访问它自己" );
当不通过命名函数来声明时,在其内部如何调用自己?
var ninja = { yell: function(n){ return n > 0 ? arguments.callee(n-1) + "a" : "hiy"; } }; console.log( ninja.yell(4) == "hiyaaaa", "arguments.callee 指的是函数自己" );
函数的名字作用域失效。
var ninja = function myNinja(){ console.log( ninja === myNinja, "这个函数的引用和名字是同一个函数" ); }; ninja(); console.log( typeof myNinja === "undefined", "但在函数外面不可以访问" ); console.log( ninja );//function myNinja()
注意,当我们使用命名函数声明再分配给一个变量时,这个函数的名字在内部可以引用,外部却不可以。而分配的变量都可以引用。
当匿名函数为一个对象的属性时,也可以调用它。
var ninja = { yell: function(n){ return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; } }; console.log( ninja.yell(4) === "hiyaaaa");//true
通过这个对象的属性,我们可以调用它。
当移除原对象时,会发生什么情况?
var ninja = { yell: function(n){ return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; } }; console.log( ninja.yell(4) == "hiyaaaa"); //true var samurai = { yell: ninja.yell }; var ninja = null; try { samurai.yell(4); } catch(e){ console.log( "不可以访问啦" ); }
同样的情况,但当我们给匿名函数一个名字时又会?
var ninja = { yell: function yell(n){ return n > 0 ? yell(n-1) + "a" : "hiy"; } }; console.log( ninja.yell(4) == "hiyaaaa"); var samurai = { yell: ninja.yell }; var ninja = null; console.log( samurai.yell(4) == "hiyaaaa", "注意,它仍然可以调用这个函数" );