javascript – 使用函数声明时的自定义函数(也称为惰性函数定义)

前端之家收集整理的这篇文章主要介绍了javascript – 使用函数声明时的自定义函数(也称为惰性函数定义)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在Stoyan Stefanov的“ JavaScript Patterns”一书中,有一个关于自定义函数的部分.
var scareMe = function(){
    console.log("Boo!");
    scareMe = function(){
        console.log("Double Boo!"); 
    }
}

scareMe();//==>Boo!
scareMe();//==>Double Boo!

它按我的预期工作.但我修改了scareMe函数如下:

function scareMe(){
     console.log("Boo!");
     function scareMe(){
         console.log("Double Boo!");
     }
 }

 scareMe();//==>Boo!
 scareMe();//==>Boo!

问题:

>他们之间有什么区别?
>在第二种情况下,为什么输出不是“Double Boo!”,而是“Boo!”

解决方法

调用时的第一个scareMe函数通过在其中创建另一个函数scareMe来覆盖自己的行为,这会覆盖上部作用域中的那个,所以原始scareMe的定义发生了变化,我已经看到如果你想第一次使用这种方法在应用程序中设置并希望在设置后立即改变其行为.

如果您已定义:

var scareMe = function(){
    console.log("Boo!");
    var scareMe = function(){ //define it with var
        console.log("Double boo!"); 
    }
}

scareMe();//==>Boo!
scareMe();//==>Boo! //you will see the behavior as that of the second one.

也是一次性设置的一个实际实现:

var scareMe = function(){
    console.log("Boo!");

   //I have done my job now. I am no longer needed.
    scareMe = undefined;

}

scareMe();//==>Boo!
scareMe();//==> oops error

第二种情况你正在创建一个名为scareMe的新函数,其范围仅在函数内,它不会覆盖自身.

试试这个例如:

function scareMe(){
     console.log("Boo!");
     function scareMe(){
         console.log("Double bool!");
     }
    scareMe(); //Now this invokes the once defined inside the scope of this function itself.
 }

 scareMe();//==>Boo! and Double bool!

猜你在找的JavaScript相关文章