在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!」
這種模式是驚人的。除了混淆之外,有沒有什麼實際用途? – GameAlchemist
@GameAlchemist:是的。有時候我有一個功能去做一些我只想做一次的事情;初始化,說。我可以這樣定義該函數:'function init(){init = function(){};/* ... * /};'現在只要按名稱使用'init'而不是實際捕獲對原始函數的引用,它只會初始化一次。這可以通過一個布爾變量來完成,但這樣你就可以減少一個跟蹤變量。 – icktoofay
有趣。因此,例如通過setInterval替換rAF可能會變成:requestAnimationFrame = function(cb){requestAnimationFrame = function(){}; return setInterval(cb,16); }。有點神祕,但優雅。 – GameAlchemist