如果函数内又定义了一个跟自己同名的函数,执行结果是什么?
function scareMe(){ alert("Boo!"); function scareMe(){ alert("double boo!"); } scareMe(); } scareMe();
结论:把函数名当变量理解,还遵循作用域链规则。即外部调用外部的,内部调用内部的。
优点是:可以延迟定义函数(同时将只执行一次的代码放到外层同名函数中)
var scareMe = function (){ alert("Boo!"); scareMe = function (){ alert("double boo!"); } }
缺点是:如果将外部函数赋给某一个变量,或对象的key时,还指向外层同名函数。
var scareMe = function (){ alert("Boo!"); scareMe = function (){ alert("double boo!"); } } scareMe.property = "properly"; var prank = scareMe; var spooky = {boo: scareMe}; prank();//Boo! prank();//Boo! console.log(prank.property);//properly spooky.boo();//Boo! spooky.boo();//Boo! console.log(spooky.boo.property);//properly scareMe();//double boo! scareMe();//double boo! console.log(scareMe.property);//undefined spooky.boo();//Boo! console.log(spooky.boo.property);//properly
结论:
//scareMe是指向外部function(){...}的指针
//赋值发生后,prank和spooky.boo也都是指向外部function(){...}的指针。
//指向了prank()方法后,scareMe是指向内部function(){}
//其实,执行prank()、spooky.boo()、scareMe()中的任一个效果都一样
转载至:http://www.it610.com/article/33030.htm