今天作一個關注/取消的功能,因爲須要向後臺發送請求,想經過控制用戶點擊發送的頻次減小沒必要要的請求,即在必定時間內,用戶點擊屢次但只發送一次數據,天然而然想到了使用【函數節流】。json
function throttle2(method, context) {
clearTimeout(method.tId);
method.tId = setTimeout(function(){
method.call(context);
}, 1000);
}
但在實際應用中,並不能達到想要效果--每次點擊都會發送一次數據,以下:
$(".daili_act_lia").click(function () {
var checkbox = $("#s11"),
options = {},
isFocus = '',
id = $(this).attr("data-id");
function throttle2(method, context) {
clearTimeout(method.tId);
method.tId = setTimeout(function(){
method.call(context);
}, 1000);
}
function myAjax() {
if(checkbox.prop("checked")) {
isFoucs = -1;
}else {
isFoucs = '';
}
options = {
focusId: id,
tag: 2,
focus: isFocus
};
console.log(options)
function returnDate(json) {
console.log(json)
}
Utils.getAjax("POST", CONFIG.API.editFocus, options, returnDate);
}
throttle2(myAjax,this)
});
一直不明白爲何。。。
最後把throttle函數修改成如下就成功了:
function throttle2(method, context) {
clearTimeout(context.tId);
context.tId = setTimeout(function(){
method.call(context);
}, 1000);
}
仔細分析,原來是每次 click 的時候,都從新建立了函數 ‘method’(本例中的 myAjax 函數),那麼throttle在內部永遠保存着一個定時器不會被清除。纔會出現每次點擊都會執行method的現象。
結論:一、 建立函數的方式 1.1 function fn(){} 函數聲明 1.2 var fn = function(){} 函數表達式二、 函數名是一個指向函數對象的指針,每建立一個函數,都會在內存從新分配一個地址,即便擁有相同的函數名,他們也不是同一個函數。三、 JavaScript 中,沒有函數重載。