鍍金池/ 問答/HTML/ 關于return function()的一點疑問

關于return function()的一點疑問

function debounce(func, wait) {
    var timeout;
    return function () {
        clearTimeout(timeout)
        timeout = setTimeout(func, wait);
    }
}

debounce函數(shù)里為什么要加return function(){ } ? 去掉會怎樣?

回答
編輯回答
司令

debounce本來就要返一個包裹函數(shù),你以后的每次調(diào)用,其實調(diào)用的都是包裹函數(shù),并不是原函數(shù)

function fetchData(){
    //some code
}

//debounceFetchData并不是fetchData,而是返回的一個匿名函數(shù),里面包裹了原函數(shù):fetchData
var debounceFetchData=debounce(fetchData,1000);

//每一次調(diào)用都會生成一個定時器
//如果上一次的定時器還沒有執(zhí)行,則會被清除
//如此就達到了防抖動的目的
debouceFetchData();
2017年9月19日 02:20
編輯回答
入她眼

為了clearTag 能訪問到又不想創(chuàng)建變量 如果需要多個這種類型的你需要創(chuàng)建多個Tag

2017年7月13日 20:10
編輯回答
別硬撐

使用了閉包,這樣防抖函數(shù)就不用在外部顯式地維護計時器ID,提高了函數(shù)的內(nèi)聚性

2017年10月16日 13:28
編輯回答
別逞強

我想回答一個很欠抽的答案:
這就是 JS「防抖、節(jié)流」的簡單實現(xiàn)方案呀,
可以去了解一下 JS「防抖、節(jié)流」的各種實現(xiàn)方案以及原理,
說白了,這就是 JS 的基本功。

「樓主看了不要罵我」

2018年6月30日 08:25
編輯回答
萌面人

我猜是為了清掉計時器的原因
如果去掉return function的話每次調(diào)用debounce這個函數(shù)都重新聲明了一個全新的timeout,所有clearTimeout清掉的是一個沒有賦值的全新的timeout,導致每次調(diào)用都啟動一個setTimeout但是清不掉

2017年5月21日 21:15
編輯回答
離殤

首先,有一個概念:

閉包:閉包的作用有兩個:1.是有權訪問另一個函數(shù)中變量的函數(shù)(也是定義)
                      2.可以把函數(shù)當做變量返回
作用域鏈:作用域鏈的訪問是:從最內(nèi)部訪問到全局作用域,內(nèi)部能訪問他之外的,反之不可      
so 你這里如果不return function,外部無法訪問這個作用域了,你var的timeout就得不到經(jīng)過function的值,每次調(diào)用debounce這個函數(shù)都重新聲明了一個全新的timeout.
                        
2018年6月7日 12:10