在Stoyan Stefanov的“
JavaScript Patterns”一书中,有一个关于自定义函数的部分.
var scareMe = function(){ console.log("Boo!"); scareMe = function(){ console.log("Double Boo!"); } } scareMe();//==>Boo! scareMe();//==>Double Boo!
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!