【JS深刻学习】——函数建立和重载

今天作一个关注/取消的功能,因为须要向后台发送请求,想经过控制用户点击发送的频次减小没必要要的请求,即在必定时间内,用户点击屡次但只发送一次数据,天然而然想到了使用【函数节流】。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 中,没有函数重载。