惰性函数——适合外层函数只需要执行一次

如果函数内又定义了一个跟自己同名的函数,执行结果是什么? 

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

猜你喜欢

转载自www.cnblogs.com/jokes/p/9486787.html
今日推荐