Javascript的函數(shù)是運行時定義的把鉴,可以隨時替換函數(shù)定義,非常的靈活。
我們先加入一個函數(shù),用于判斷是否是chrome
function isChrome() {
return /chrome/i.test(navigator.userAgent);
}
經(jīng)常會有類似這樣的需求阵具,根據(jù)瀏覽器環(huán)境,執(zhí)行不同的功能定铜,常規(guī)做法是這樣
function normalCreate() {
if (isChrome()) {
console.log('normal create in chrome');
} else {
console.log('normal create in other browser');
}
}
normalCreate();
normalCreate();
normalCreate();
chrome控制臺的輸出
normal create in chrome
normal create in chrome
normal create in chrome
這很常見阳液,就不做講解了。
我們假設(shè)isChrome是一個非常消耗性能的函數(shù)揣炕,每次都執(zhí)行一次isChrome帘皿,電腦和用戶都會十分痛苦。這時就可以用惰性函數(shù)定義(Lazy Function Definition)來解決這個問題祝沸,在《Javascript高級程序設(shè)計》中矮烹,翻譯為惰性載入函數(shù),怎么看都是一個惰加載圖片的意思……咱們還是叫惰性函數(shù)定義吧.
可以像這樣改寫:
function lazyLoadCreate () {
console.log('first creating'); // pos-1
if (isChrome()) {
lazyLoadCreate = function () {
console.log('create function in chrome');
}
} else {
lazyLoadCreate = function () {
console.log('create function in other browser');
}
}
return lazyLoadCreate();
}
lazyLoadCreate();
lazyLoadCreate();
lazyLoadCreate();
chrome 控制臺的輸出
first creating
create function in chrome
create function in chrome
create function in chrome
還有另一種寫法罩锐,更加簡潔
var lazyLoadCreate = (function() {
console.log('first creating');
if (isChrome()) {
return function () {
console.log('create function in chrome');
}
} else {
return function () {
console.log('create function in other browser');
}
}
})();
可見lazyloadCreate在第一次執(zhí)行這個函數(shù)時被替換了奉狈, pos-1處只執(zhí)行了一次
我公司有個支付小網(wǎng)站,就需要根據(jù)進入時是微信還是支付寶進入涩惑,決定不同的支付方式與界面主題,這時就可以用到惰性函數(shù)定義(Lazy Function Definition)